java中的奇怪循环行为

时间:2018-03-15 20:51:20

标签: java arrays for-loop

我是一名java学习者,我有一个任务要在论坛上了解更多信息。 挑战是接收一个数字并乘以它自己的数字,如:

输入999

输出`9 * 9 * 9 = 729然后7 * 2 * 9 = 126再次1 * 2 * 6 = 12最后1 * 2 = 2直到它只击中一个数字。

我遇到了这个问题,我要求变量添加一个长度为2的数组的乘法它返回给我

 1------------------1
 49-----------------2 
 final result 2450

这就是代码..

class Persist {
  public static void persistence(long n) {
     String number = String.valueOf((int)n);
     char[] digits1 = number.toCharArray();
     int value = 1;

     for(int i = 0 ;i <= digits1.length -1;i++) {
        System.out.println(value + "-----------------" + digits1[i]);
        value = value* (int)digits1[i];
     }

     System.out.println((int)value);
 }

 public static void main(String [] args) {
    persistence(12);
 }
}

我可以尝试解决这个问题,但是我很想知道什么是错的。谢谢大家提前帮助,只是路过。

4 个答案:

答案 0 :(得分:1)

您使用的是数字的ASCII值(请参阅https://en.wikipedia.org/wiki/ASCII),即1 = 49和2 = 50

49 * 50 = 2450

您可以使用Character.getNumericValue来获取char的数值,即

class Persist {
    public static void persistence(long n) {
        String number = String.valueOf((int)n);
        char[] digits1 = number.toCharArray();
        int value = 1;
        for(int i = 0 ;i <= digits1.length -1;i++) {
            System.out.println(value + "-----------------" + digits1[i]);
            value = value* Character.getNumericValue((int)digits1[i]);

        }
        System.out.println((int)value);
    }

    public static void main(String [] args) {
        persistence(12);

    }

答案 1 :(得分:0)

如果使用调试器查看值,最容易理解。在实际计算 | c1 | c2 | c3 | c4 | c5 | c6 r1 | Red | 53 | Blue | 45 | Yellow | 15 期间,您没有使用数字的值,而是使用字符的ASCII值。这是1-> 49和2-> 50,因此您计算49 * 50 = 2450。 将行更改为value = value * (int)digits1[i],即可获得所需内容。

答案 2 :(得分:0)

这是我怎么做的。我调整它以便将0值数字转换为1.您可以将其注释掉(这是因为0的任何数字将答案变为0)。此版本将继续重新倍增,直到它降至一位数。

public class Persist {
    public static void main(String [] args) {
        int answer = persistence(234);
        System.out.println("        length: " + String.valueOf(answer).length());
        while (  String.valueOf(answer).length() > 1)   {   
            answer = persistence(answer);
        } }

    static int persistence(int n) {
        int value = 1;
        String myStr = String.valueOf(n);
        int myStrLen = myStr.length();
        int[] finalIntAr = new int[myStrLen];                                               

        for (int v=0; v< myStrLen;  v++) {
            String subS= myStr.substring(v,v+1);
            System.out.println("the char/int : " + subS);
            Integer bigI = Integer.valueOf(subS);
            if (bigI == 0) { bigI = 1; }   // take this out if you want 0 to perform as 0
            finalIntAr[v] = bigI.intValue();
        }

        for (int i = 0 ;   i < myStrLen;  i++) {
            System.out.println("   -----     first=  " +  value + "  multiplied by : " + finalIntAr[i]);
            value = value * finalIntAr[i];
        }
        System.out.println("\n CURRENT FINAL VALUE *** : " + value);
        return value;
    } }

输出:

the char/int : 2
the char/int : 3
the char/int : 4
   -----     first=  1  multiplied by : 2
   -----     first=  2  multiplied by : 3
   -----     first=  6  multiplied by : 4

 CURRENT FINAL VALUE *** : 24
        length: 2
the char/int : 2
the char/int : 4
   -----     first=  1  multiplied by : 2
   -----     first=  2  multiplied by : 4

 CURRENT FINAL VALUE *** : 8

答案 3 :(得分:0)

由于没有人发布没有字符串或字符的答案,我会的。但技术上并不是你问题的答案。

public static void persistence(long x)
{
    long answer = 1;
    while (x != 0) {
        long onesDigit = x % 10;
        answer *= onesDigit;
        x /= 10;
    }
    System.out.println(answer);
}