【题目】
如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。
对新产生的正整数再做同样的处理。
如此一来,你会发现,不管开始取的是什么数字,
最终如果不是落入1,就是落入同一个循环圈。
请写出这个循环圈中最大的那个数字。
请填写该最大数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
【分析】
手动推算可以发现1不会落入循环圈,2会落入循环。
那么就以2为开始点,想办法找出循环圈中的所有数字。
计算法则是:把正整数的每一位平方后再求和,得到的新整数继续这样操作。
那么只要发现一旦出现第一个开始重复的数字,说明之前从这个数字开始到这个数字结束的所有数字就是平方怪圈的所有数字,有了这些数字,就可以求出它们的最大值。
【源码】
public static void main(String[] args) {
//创建一个List对象
ArrayList<Integer> a = new ArrayList<Integer>();
//以数字2开始,寻找平方怪圈
int b = 2;
//把b加入到List集合中去
a.add(b);
//开始循环
ok:while (true) {
//按照规则获得下一个数字
b = getNext(b);
//遍历List集合,发现有没有与b重复的数字
for (int i=0; i<a.size(); i++) {
if(b == a.get(i)){
//如果发现重复的数字,就把从这个数字开始到最末尾的数字全部转移到另一个List中
List<Integer> c = a.subList(i, a.size());
//利用API对List集合进行排序
Collections.sort(c);
//从小到大排列后,打印出最大值
System.out.println(c.get(c.size()-1));
break ok;
}
}
a.add(b);
}
}
//求一个正整数n的每个位上的平方和
private static int getNext(int n){
int sum = 0;
String s = String.valueOf(n);
for (int i = 0; i < s.length(); i++) {
int x = s.charAt(i)-'0';
sum += x * x;
}
return sum;
}
【结果】
145
【总结】
本题解题的关键在于将看似没有着地点的问题找一个具体点代表,解法中的2就是这个点,以它为出发点,找出平方怪圈。大胆推测,小心求证。