我尝试编写代码以获得大数字的最大素数因子(在本例中为600851475143)。 在编写了四种不同的方法(2显示结果,2显示其他计算)后,我编写了程序类,并尝试运行它。
当我运行它时,结果应出现在控制台中,但没有显示任何内容。我试图制作应该公开打印的变量,然后手动打印,但它没有用。最后,我在main方法中编写了最简单的System.out.print()
命令,但控制台中没有出现任何内容。
我不知道问题是什么。这里有人有线索吗?
班级:
public class Problem3 {
public float sum1;
public float sum2;
private float num = 600851475143f;
public void methodGuy(){
while(sum1==0){
for(int i=2; i<num/2; i++){
if(num%i==0){
sum1=num/i;
} else {}
}
}
}
public void show1(){
System.out.println("the result of Guys method is: " + sum1);
}
public void methodOr(){
for(int i=2; i<num/2; i++){
for(float x=num/2; x>2; x=x-1){
if(i*x==num){
sum2=x;
}
}
}
}
public void show2(){
System.out.println("the result of Ors method is: " + sum2);
}
}
程序类:
public class Program {
public static void main(String[] args) {
Problem3 x = new Problem3();
x.methodGuy();
x.show1();
x.methodOr();
x.show2();
}
}
答案 0 :(得分:1)
methodGuy
永远不会终止,因为int
不能那么大。
int
的最大可能值为2147483647.如果您的int
是该数字,并且您向其添加一个,则该数字将会回绕并变为负数。所以在i++
之后,下一个值将是-2147483648。由于只要i
小于600851475143/2 = 300425237071.5,循环就会继续,并且因为i
总是小于那个,所以你的循环是无限的。
最好是让i
和num
都有long
类型,而不是int
或float
。即使你这样做,你的循环可能会运行很长时间。
事实上,如果没有因素,循环将是无限的,因为sum
永远不会被设置为0以外的东西,然后因为你说while (sum==0)
,循环才会开始再一次,无限地做同样的事情。因此除了回绕问题之外,您的算法仍然需要工作。
进一步说明:您绝对不希望使用float
,因为无法准确表示数字600851475143。 num
的实际值为600851480576。