جافا:الفشل في العمل بأعداد كبيرة (مشروع أويلر:#1)
-
21-12-2019 - |
سؤال
النظر في التعليمات البرمجية التالية:
public static void main(String[] args){
int target = 99999;
revised(target);
long total = 0;
for(int x = 0; x <= target; x++){
if(x % 3 == 0 || x % 5 == 0)
total+=x;
}
System.out.println("Method B: " + total);
}
private static double findSum(int target, int divisor){
int upperBound = target/divisor;
return divisor*(upperBound+1)*upperBound*.5;
}
private static void revised(int target){
double sumOne = findSum(target, 3);
double sumTwo = findSum(target, 5);
double sumThree = findSum(target, 15);
System.out.printf("Method A: %.0f \n", sumOne + sumTwo - sumThree);
}
مشروع أويلر # 1 مشكلة:اطبع مجموع الأعداد الصحيحة القابلة للقسمة على 3 أو 5.
الكود التالي صحيح عندما يكون الهدف هو 9 ، 99 ، 999 ، 9999;ومع ذلك ، يفشل عند تعيين المتغير الهدف إلى 99999.لا تسفر الإجابة الناتجة عن الوظيفة المنقحة عن نفس نتيجة طريقة القوة الغاشمة الموجودة في الوظيفة الرئيسية.لا أعتقد أن هذا يرجع إلى تجاوز من النوع المزدوج.
هل يمكن لشخص ما أن يشرح سبب فشل الوظيفة المنقحة عند إعطائها أعدادا كبيرة ولكنها تعطي نفس النتائج (كطريقة القوة الغاشمة) عند إعطاء أرقام أصغر?
المحلول
مجرد استخدام نفسه DataType
في كل مكان Double
public static void main(String[] args){
int target = 99999;
revised(target);
}
private static double findSum(double target, double divisor){
double upperBound = target/divisor;
System.out.println("|"+upperBound+"|"+target+"|"+divisor);
return divisor*(upperBound+1)*upperBound*.5;
}
private static void revised(double target){
double sumOne = findSum(target, 3);
double sumTwo = findSum(target, 5);
double sumThree = findSum(target, 15);
System.out.printf("%.0f \n", sumOne + sumTwo - sumThree);
System.out.println("|"+sumOne+"|"+sumTwo+"|"+sumThree);
}
تحدث هذه المشكلة ، عندما يتم تحويل نوع البيانات جولة يتم تنفيذ
لا تنتمي إلى StackOverflow