以人类的方式计算数字的程序

时间:2016-03-14 22:52:54

标签: java counting

在课堂上,我们获得了一个项目来制作一个程序,以人类自然的方式计算数字,因此如果用户输入2个输入,我们的程序会计算人类应该计算的数字(添加1到最后一位,如果最后一位是9,加1将它变为0并在该位之前加1,并返回一个带有输入,输出和所有数字的字符串。

他在课堂上给了我们一些代码,然后现在讨论它我不知道他的方法的参数究竟是什么意思所以我不明白他在哪里这个:

static String nextNum(String base, String n) {
    int i=n.length()-1;
    char digit = n.charAt(i);
    int pos = base.indexOf(digit);
    n=n.substring(0,i-1) + base.charAt(pos+1); //next symbol in the base

    return n;
}

两个String参数应该是什么?他的董事会也有一个for循环:

for (int i = n.length()-1; i>=0; i--) {
    char digit = n.charAt(i);
    int pos=base.indexOf(digit);

    if(pos==base.length()-1) { //case2 - for switching 9 to 0
        n=n.substring(0,i-1) + base.charAt(0)+n.substring(i+1);
    } else { //case1
        n=n.substring(0,i-1)+base.charAt(pos+1)+n.substring(i+1);
    }
}

同样,我不确定basen应该是什么,所以我很难看到他在做什么。我不是要求任何人为我编写项目,我真的很感谢有人为我清理这个项目并给我提示如何使用这些代码来获得他想要的程序。

3 个答案:

答案 0 :(得分:0)

Base是您的号码的字符集。例如,对于基数10,人们通常计算的方式,字符串将是“0123456789”。对于基数2(二进制),字符串将为“01”。

字符串n是您需要递增的数字。例如,假设我们使用基数10(字符串是“0123456789”),我们想要增加的数字是19.在这种情况下,字符串n将是“19”。

现在,让我们看看循环中会发生什么。

for (int i = n.length()-1; i>=0; i--)

在这里,我们从i = 2 - 1 = 1开始。 所以

char digit = n.charAt(i);
int pos=base.indexof(digit);

数字将为'9'(第二个字符),pos将是该字符在base中的位置,因此为9。

条件if(pos==base.length()-1)将被履行,'9'将被替换为'0'。

在第二次迭代中,条件不会被满足,数字'1'将增加到'2',结果将根据需要变为'20'。

但是,对于值为“11”的字符串n,输出将为“22”。修复代码。

答案 1 :(得分:0)

以下代码块将向您展示如何添加2个数字,这些数字以字符串形式显示。这是为了帮助您了解如何获取nextNumber [获取下一个数字与添加1相同]。我没有考虑过这里的负数案例。由于我使用的是基数10,因此所有/%都是10&。希望这能帮助您理解。如果您需要一些澄清,请告诉我。

String top = "34521";
String bottom = "123";

int topPtr = top.length() - 1;
int bottomPtr = bottom.length() - 1;
int carry = 0, curSum = 0;
StringBuilder sum = new StringBuilder();
while (topPtr != -1 && bottomPtr != -1) {
    int topVal = top.charAt(topPtr) - '0';
    int bottomVal = bottom.charAt(bottomPtr) - '0';
    curSum = topVal + bottomVal + carry;
    carry = curSum / 10;
    sum.append(curSum % 10);
    topPtr--;
    bottomPtr--;
}
while (topPtr != -1) {
    int topVal = top.charAt(topPtr) - '0';
    curSum = topVal + carry;
    carry = curSum / 10;
    sum.append(curSum % 10);
    topPtr--;
}

while (bottomPtr != -1) {
    int bottomVal = bottom.charAt(bottomPtr) - '0';
    curSum = bottomVal + carry;
    carry = curSum / 10;
    sum.append(curSum % 10);
    bottomPtr--;
}
System.out.println(sum.reverse().toString());

答案 2 :(得分:0)

nextNum似乎已经接近完成,只包括溢出案例。基本上你只是"只是"需要为当前位置的数字用完的情况添加else分支。

base通常为0123456789

/**
 * Compute the successor of the parameter n, which is required to be
 * a String of digits from from the parameter base, representing a
 * number.
 */
static String nextNum(String base, String n) {
  int i = n.length() - 1;         // Index of the last digit in n
  char digit = n.charAt(i);       // The last digit 
  int pos = base.indexOf(digit);  // Position of the last digit in base
  if (pos + 1 < base.length) {    // Is there a "next" digit available in base?
     // Replace the last digit accordingly  
     n = n.substring(0, i) + base.charAt(pos + 1);  
  } else if (i > 0) {
     // Regular overflow case: 
     //   Increase the preceding digit(s) and  
     //   reset the last digit to 0 
     n = nextNum(base, n.substring(0, i)) + base.charAt(0);
  } else {
     // We need to add a digit
     n = "" + base.charAt(1) + base.charAt(0);
  }
  return n;
}