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

Adding Values to a List and Converting to BigInteger - Java

我正在编写一个代码来确定最小整数,该整数是一个七的序列,后跟一些零(可能 none),可以被 int n 整除。由于这个数字可能很大,return 值应该是 BigInteger.

到目前为止,我的代码有一个 if-else 阶梯,它涵盖了以下情况:如果任何 int n 不能被二或五整除,则保证只包含七(没有零)。在 int n 不能被 2 或 5 整除的情况下,我的想法是继续在 while 循环中将 sevens 添加到 LinkedList,直到该列表(转换为 BigInteger)可以被 int n 整除.同样的逻辑适用于 int n 可以被二或五整除的情况,除了两个 for 循环会在列表中添加七和零。

我的代码在将列表转换为字符串然后再转换为 BigInteger 时出现运行时错误,特别是在行 BigInteger numBig = new BigInteger(str); 上。错误是:"java.lang.NumberFormatException: Zero length BigInteger (in java.math.BigInteger)" 此外,我不太确定 int n 可被二或五整除的逻辑是否合理。

"Zero length BigInteger" 表示您正在尝试从长度为 0 的内容创建 BigInteger。堆栈跟踪会告诉您确切的行。

我猜错误出在您的 convert 方法中。如果你传入一个空列表,它会尝试将空字符串转换为 BigInteger new BigInteger("")

我不知道你的算法在这种情况下应该做什么。例如,如果你想将一个空列表转换为数字零,你可以这样做:

if (res.isEmpty()) return BigInteger.ZERO;

此任务不需要 BigInteger。思路如下:

  • 首先确定所需零的数量。由于只有七的数不能被2或5整除,所以零的个数等于数n中2或5的最大次方。

  • 现在我们有一个数n,它不能被2或5整除。假设一个由m个七组成的数除以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());
  }