【蓝桥杯】【平方怪圈】

题目
如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。
对新产生的正整数再做同样的处理。
如此一来,你会发现,不管开始取的是什么数字,
最终如果不是落入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就是这个点,以它为出发点,找出平方怪圈。大胆推测,小心求证。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值