জাভা 8: 1.8e8 2.4e8
এই এন্ট্রিটি ইতিমধ্যে থাকা অন্য কয়েকটিটির সাথে তুলনা করে না, তবে আমি আমার উত্তর পোস্ট করতে চেয়েছি কারণ আমি এতে কাজ করতে মজা পেয়েছি।
আমার পদ্ধতির মূল অপ্টিমাইজেশানগুলি নিম্নরূপ:
- প্রতিটি সমান সংখ্যার 2 এর একটি ক্ষুদ্রতম ফ্যাক্টর থাকে, সুতরাং প্রতিটি বিজোড় সংখ্যা প্রক্রিয়া করার পরে এগুলিতে বিনামূল্যে যোগ করা যায়। মূলত, আপনি নিরূপণ করা কাজ সম্পন্ন করা হয়েছে
T(N)
যখন N % 2 == 1
, আপনি কি জানেন যে T(N + 1) == T(N) + 2
। এটি আমাকে আমার গণনা তিনটি থেকে শুরু করতে এবং দ্বিগুণ দ্বারা পুনরাবৃত্তির মাধ্যমে বৃদ্ধি করতে সহায়তা করে।
- আমি আমার প্রাথমিক সংখ্যাগুলিকে কোনও
Collection
ধরণের বিপরীতে অ্যারেতে সঞ্চয় করি । এটি দ্বিগুণেরও বেশি N
আমি পৌঁছাতে পারি।
- আমি মৌলিক সংখ্যাগুলি এরোটোস্টিনিসের চালনা সম্পাদনের বিপরীতে কোনও সংখ্যাকে ফ্যাক্টর হিসাবে ব্যবহার করি। এর অর্থ হ'ল আমার মেমরির সঞ্চয়স্থান আমার প্রাইম অ্যারেতে প্রায় সম্পূর্ণ সীমাবদ্ধ।
- আমি যে সংখ্যার জন্য ক্ষুদ্রতম ফ্যাক্টরটি অনুসন্ধান করার চেষ্টা করছি তার বর্গক্ষেত্র সংরক্ষণ করি। আমি প্রতিবার একটি প্রধান উপাদানকে স্কোয়ার করার জন্য @ ব্যবহারকারীর 1354678 এর পদ্ধতির চেষ্টা করেছি, তবে এটি আমার স্কোর থেকে প্রায় 1e7 এর চেয়ে বেশি ব্যয় করেছে।
এটি সব কিছুই আছে। আমার কোডটি 3 থেকে দ্বিগুণ দ্বারা পুনরাবৃত্তি হয় যতক্ষণ না এটি সনাক্ত করে যে এটি সময় সীমাটিকে হিট করেছে বা অতিক্রম করেছে, যার বিন্দুতে এটি উত্তরটি ছড়িয়ে দেয়।
package sum_of_smallest_factors;
public final class SumOfSmallestFactors {
private static class Result {
private final int number;
int getNumber() {
return number;
}
private final long sum;
long getSum() {
return sum;
}
Result(int number, long sum) {
this.number = number;
this.sum = sum;
}
}
private static final long TIME_LIMIT = 60_000_000_000L; // 60 seconds x 1e9 nanoseconds / second
public static void main(String[] args) {
SumOfSmallestFactors main = new SumOfSmallestFactors();
Result result = main.run();
int number = result.getNumber();
long sum = result.getSum();
System.out.format("T(%,d) = %,d\n", number, sum);
}
private int[] primes = new int[16_777_216];
private int primeCount = 0;
private long startTime;
private SumOfSmallestFactors() {}
private Result run() {
startClock();
int number;
long sumOfSmallestFactors = 2;
for (number = 3; mayContinue(); number += 2) {
int smallestFactor = getSmallestFactor(number);
if (smallestFactor == number) {
addPrime(number);
}
sumOfSmallestFactors += smallestFactor + 2;
}
--number;
Result result = new Result(number, sumOfSmallestFactors);
return result;
}
private void startClock() {
startTime = System.nanoTime();
}
private boolean mayContinue() {
long currentTime = System.nanoTime();
long elapsedTime = currentTime - startTime;
boolean result = (elapsedTime < TIME_LIMIT);
return result;
}
private int getSmallestFactor(int number) {
int smallestFactor = number;
int squareRoot = (int) Math.ceil(Math.sqrt(number));
int index;
int prime = 3;
for (index = 0; index < primeCount; ++index) {
prime = primes[index];
if (prime > squareRoot) {
break;
}
int remainder = number % prime;
if (remainder == 0) {
smallestFactor = prime;
break;
}
}
return smallestFactor;
}
private void addPrime(int prime) {
primes[primeCount] = prime;
++primeCount;
}
}
জাভা 8 এর সর্বশেষ সংস্করণ সহ একটি ভিন্ন সিস্টেমে (উইন্ডোজ 8.1, ইন্টেল কোর আই 7 @ 2.5 গিগাহার্টজ, 8 জিবি র্যাম) চালানো কোনও কোড পরিবর্তন ছাড়াই উল্লেখযোগ্যভাবে আরও ভাল ফলাফল করেছে:
T(240,308,208) = 1,537,216,753,010,879