下面的算法可以识别一个较小的因子,但是在使用较大的因子(例如7534534523.0)时会完全失败
double result = 7; // 7534534523.0;
double divisor = 1;
for (int i = 2; i < result; i++){
double r = result / (double)i;
if (Math.floor(r) == r){
divisor = i;
break;
}
}
System.out.println(result + "/" + divisor + "=" + (result/divisor));
7534534523.0在计算器上的数字除以2可以得出小数部分或将其四舍五入(丢失0.5)。如何对大量数字执行这种检查?我必须为此使用BigDecimal吗?还是有另一种方法?
最佳答案
我看不到您的代码有什么问题。它的工作原理与应有的一样。
当我运行您的代码时,我得到以下输出:
7.534534523E9/77359.0=97397.0
那可能让您感到困惑,但它完全可以。它只是使用科学的符号,但这没有错。
7.534534523E9 = 7.534534523 * 109 = 7,534,534,523
如果要以普通符号查看它,可以使用
System.out.format
打印结果:System.out.format("%.0f/%.0f=%.0f\n", result, divisor, result / divisor);
显示:
7534534523/77359=97397
但是,您不需要double或BigDecimal即可检查一个数字是否可被另一个数字整除。您可以对整数类型使用取模运算符,以检查一个数字是否可被另一个数整除。只要您的数字适合
long
,它就可以使用,否则您可以继续使用BigInteger
:long result = 7534534523L;
long divisor = 1;
for (int i = 2; i < result; i++) {
if (result % i == 0) {
divisor = i;
break;
}
}
System.out.println(result + "/" + divisor + "=" + (result / divisor));