首页 > 解决方案 > 用于解决附加持久性的 while 循环

问题描述

在 while 循环的第一次迭代之后,num 的值变为 29,长度为 2(您可以通过在 for 循环后取消对 print 和 break 的注释来看到这一点)。然后while循环应该再次运行,因为num的长度是2,但它实际上变成了一个无限循环。我错过了什么?

public static void main(String[] args)
{
    String num = "9992";
    
    calculateAdditivePersistance(num);
}

public static void calculateAdditivePersistance( String num )
{
    int count   = 0;
    int total   = 0;
    
    while(num.length() > 1)
    {
        for( int x = 0; x < num.length(); x++)
        {
            total+= Character.getNumericValue(num.charAt(x));
        }
        num = Integer.toString(total);
        //System.out.println(num); uncomment this out to see that num value becomes 29
        count++;
        //break;  uncomment this out to see that num value becomes 29
    }
    System.out.println(count);
}

标签: javawhile-loopinfinite-loop

解决方案


如前所述,答案是您没有将总数重置为 0。但这是另一种方法,它允许任意长度的数字字符串,(up to their sum < Integer.MAX_VALUE)并且在字符串转换中相对有效。

它的工作原理如下:

  • 接受一串整数。
  • 循环而字符串的长度> 1(即超过一个数字)。
  • 流式传输字符并通过减去 char 0 ('0') 将它们相加以转换为int字符的等价物
  • 转换回字符串并重复。

该方法返回一个List<String>转换size列表,其中的列表是转换的数量。

String num = "99929222820283934829";

List<String> result = calculateAdditivePersistance(num);
System.out.println("Transitions = " + result);
System.out.println("Total transitions = " + result.size());

印刷

Transitions = [102, 3]
Total transitions = 2

修改后的方法。

    
public static List<String> calculateAdditivePersistance(String num) {
    List<String> conversions = new ArrayList<>();
    while(num.length() > 1) {
        num = num.chars().reduce(0, (a,b)->a + b-'0')+"";
        conversions.add(num);
    }
    return conversions;
}

推荐阅读