java - 用于解决附加持久性的 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);
}
解决方案
如前所述,答案是您没有将总数重置为 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;
}
推荐阅读
- javascript - 如何在基于类的组件中使用 React.forwardRef?
- amazon-web-services - 禁用 http 重定向到 https
- python - 如何使用 python comtypes.client 为特定版本的应用程序创建 com 对象?
- javascript - module.js 中的语法错误 - 应用程序在 IE 和 Egde 中为空白
- r - R中更快的多列部分字符串识别循环
- pdf - 浏览器是否可以重新打开下载的文件,而不是每次请求时都下载文件?
- git - Git - 查找提交的所有父母的最古老的共同祖先分支点?
- python - 如何根据同义词映射两个数据框?我尝试使用同义词集,但并不详尽
- android - 在 DialogFragment 中引用布局层内的视图
- intellij-idea - 如何在 IntelliJ 窗口中堆叠或包装代码选项卡