向列表添加值并转换为BigInteger-Java



我正在编写一个代码,该代码确定最小整数,该整数是一个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整除。假设由m7组成的数除以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;

最新更新