我正在编写一个代码,该代码确定最小整数,该整数是一个7的序列,后跟一些可以被int n
整除的零(可能为零(。由于这个数字可能是巨大的,所以返回值应该是BigInteger
。
到目前为止,我的代码有一个if-else梯形图,它涵盖了这样一种情况:如果任何int n
不能被二或五整除,则保证只包含七个(没有零(。在int n
不能被2或5整除的情况下,我的想法是在while循环中继续向LinkedList添加7,直到该列表(转换为BigInteger(可以被int n
整除。同样的逻辑适用于int n
可被2或5整除的情况,除了2 for循环会将7和0添加到列表中。
我的代码在将列表转换为字符串,然后转换为BigInteger
时,特别是在BigInteger numBig = new BigInteger(str);
行,出现了运行时错误。错误为:"java.lang.NumberFormatException:Zero-length BigInteger(在java.math.BigInteger中("此外,我不太确定int n
可被2或5整除的情况下的逻辑是否正确。
此任务不需要BigInteger。想法如下:
-
首先确定所需零的数量。由于只有七个组成的数不能被2或5整除,所以零的数量等于数
n
中2或5的最大幂。 -
现在我们有一个数
n
,它不能被2或5整除。假设由m
7组成的数除以n
的余数等于r
:
777...m-times..777 mod n = r
那么由(m+1(7组成的数字将有一个余数10*r+7,因为
777..(m+1)-times...777 = 777...m-times...7 * 10 + 7
所以你可以重新计算余数,直到它变成零。
public static BigInteger method(int n) {
int two;
for (two = 0; n % 2 == 0; two++) n /= 2;
int five;
for (five = 0; n % 5 == 0; five++) n /= 5;
int zeros = Math.max(two, five);
int sevens = 1;
int r = 7 % n;
while (r != 0) {
r = (r * 10 + 7) % n;
sevens++;
}
// Now just make a number of 'sevens' sevens and 'zeros' zeros:
StringBuilder result = new StringBuilder();
for (int i = 0; i < sevens; i++) {
result.append("7");
}
for (int i = 0; i < zeros; i++) {
result.append("0");
}
return new BigInteger(result.toString());
}
"Zero-length BigInteger"表示您正试图从长度为0的东西创建一个BigInteger。堆栈跟踪会告诉您具体在哪一行。
我猜这个错误在你的convert
方法中。如果传入一个空列表,它会尝试使用new BigInteger("")
将空字符串转换为BigInteger
我不知道你的算法在这种情况下应该做什么。例如,如果你想将一个空列表转换为数字0,你可以这样做:
if (res.isEmpty()) return BigInteger.ZERO;