双十进制字符串

Double a decimal string

我正在 java 中编写我自己的大整数 class 而无需导入,并且需要一种方法来将字符串表示的任何大小的数字加倍。我为此编写的代码现在可以使用,但一旦数字变得越来越大,就会开始花费很长时间。我实际上创建了两个数组:主数组和倒计时数组,它们都是以同一事物开始的。然后,我 运行 一个 while 循环并递增主数组并递减倒计时数组。当倒计时数组达到“0”时,我终止循环,结果是一个新数组,新数组的大小加倍。然后我当然有 if 语句检查数组是否需要更改十位等......这就是我所拥有的...有什么方法可以使它更高效,更快捷?

public static String doubleDecimalString (String main) {
    String countdown = main;    
    String finalBuild = "";
    boolean runLoop = true;

    //if zero is supplied, skip all the nonsense and just return 0
    //else, loop through and find the true double

    //was having trobule getting single digits to double correctly so i had to hard code this for now.
   if (main.equals("0")) {
        return main;
    } else if (main.equals("5")) {
        return "10";
    } else if (main.equals("6")) {
        return "12";
    } else if (main.equals("7")) {
        return "14";
    } else if (main.equals("8")) {
        return "16";
    } else if (main.equals("9")) {
        return "18";
    } else {
        //Array for ORIGINAL NUMBER
        int[] mainPiece = new int[main.length()+2];
        int arrayLength = mainPiece.length;

        for ( int i = 0; i < main.length(); i++ ) {
           mainPiece[i+2] = Integer.parseInt(main.substring( i, i+1));
        }
        mainPiece[0] = -1;
        mainPiece[1] = -1;

        //Array for COUNTDOWN NUMBER
        int[] countdownPiece = new int[main.length()+2];

        for ( int i = 0; i < main.length(); i++ ) {
           countdownPiece[i+2] = Integer.parseInt(main.substring( i, i+1));
        }
        countdownPiece[0] = -1;
        countdownPiece[1] = -1;

        while (  runLoop ) {

            //Increment and decrement the two arrays
            mainPiece[arrayLength-1] += 1;    
            countdownPiece[arrayLength-1] -= 1;        

            //UPDATE MAIN ARRAY
            if (  mainPiece[arrayLength-1] == 10 ) {
                for (int x = arrayLength-1; x > 0; x--) {

                  if ( (mainPiece[x] == 10) && (mainPiece[x-1] != 9) ) {
                        mainPiece[x] = 0;
                        mainPiece[x -1] += 1;
                    } else if ( (mainPiece[x] == 10) && (mainPiece[x-1] == 9) ) {
                        mainPiece[x] = 0;
                        mainPiece[x -1] += 1;    
                        x = arrayLength;
                    } 
                     if ( (mainPiece[2] == 10) ) {
                        mainPiece[1] = 1;
                        mainPiece[2] = 0;
                    }

                }
            } // end main array

          //UPDATE SIDE ARRAY
            if (  countdownPiece[arrayLength-1] == -1 ) {
                for (int x = arrayLength-1; x > 0; x--) {

                   if ( (countdownPiece[x] == -1) && (countdownPiece[x-1] > 0) && (x > 1)  ) {
                        countdownPiece[x] = 9;
                        countdownPiece[x -1] -= 1;
                    } else if ( (countdownPiece[x] == -1) && (countdownPiece[x-1] == 0) && (x > 1) ) {
                        countdownPiece[x] = 9;
                        countdownPiece[x -1] -= 1;    
                        x = arrayLength;
                    }  

                }
            } //end side array


           //tests whether the pieces need to be switched to -1 for scanning
            for (int x = 0; x < arrayLength - 1; x++) {
                  if ( (countdownPiece[x] == -1 ) && (countdownPiece[x+1] == 0 ) ) {
                        countdownPiece[x+1] = -1;
                  }
            }

            //if the side array has reached "0" then the loop will stop and the main array will return the new doubled value
            if ( (countdownPiece[arrayLength-1] == -1) &&  (countdownPiece[arrayLength-2] == -1) )   {
                break;
            }

        } //end while loop

            //transform array into string
            finalBuild = "";      
            for (int T = 0; T < arrayLength; T++) {
                finalBuild += (mainPiece[T] != -1) ? mainPiece[T] : "";
             }
              return finalBuild;
    }           

}

这样的事情怎么样(它基本上乘以二并计算进位):

private String doubleNumber(String number)
{
    int doubleDig = 0;
    int carry = 0;

    StringBuilder sb = new StringBuilder();
    for (int i = number.length() - 1; i >= 0; --i)
    {
        char c = number.charAt(i);
        int origNum = Character.getNumericValue(c);
        doubleDig = origNum * 2 + carry;
        carry = doubleDig / 10;
        doubleDig = doubleDig % 10;

        sb.append(doubleDig);
    }
    if (carry > 0)
    {
        sb.append(carry);
    }

    return sb.reverse().toString();
}

显然这只处理整数。

我会使用 StringBuilder 或 List 来构建您的双倍价值。

使用进位变量存储进位量并初始化为0。

从最低有效位开始,将数字加倍并添加进位。

然后将carry设置为digit / 10,然后将digit设置为digit % 10

digit 添加到您的构建器或列表中。

循环遍历所有数字后,检查 carry 是否 > 0 并在需要时追加。

反转 StringBuilder 或列表并加入,您就有了答案。

public class Doubler {
  public static void main(String[] args) {
        System.out.println(doubleDec("9123123123087987342348798234298723948723987234982374928374239847239487.23233099"));
  }

  public static String doubleDec(String dec) {
    StringBuilder builder = new StringBuilder();
    int carry = 0;
    for (int i = dec.length() - 1; i > -1 ; i--) {
      char charDigit = dec.charAt(i);
      if (charDigit == '.') {
        builder.append(charDigit);
      } else {
        int digit = Character.getNumericValue(charDigit);
        if (digit == -1) {
          throw new IllegalStateException("Invalid character in decimal string.");
        }
        digit = digit * 2 + carry;
        carry = digit / 10;
        digit = digit % 10;
        builder.append(digit);
      }
    }
    if (carry != 0) {
      builder.append(carry);
    }
    return builder.reverse().toString();
  }
}

// 18246246246175974684697596468597447897447974469964749856748479694478974.46466198