平方怪圈
如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。
对新产生的正整数再做同样的处理。
如此一来,你会发现,不管开始取的是什么数字,
最终如果不是落入1,就是落入同一个循环圈。
请写出这个循环圈中最大的那个数字。
请填写该最大数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
问题分析
第一:怎么快速的取出一个数上的每一位数,第二:处理平方和。
第一种方法是把每一次的打印出来,一眼即可观察出规律。
第二种方法是把每一次的平方和存储到一个数组或者集合中(我这里用的是集合),如果后面某一次的平方和在数组或者集合中没有出现过,存到其中;否则,即有重合的,即机进入“平方怪圈”。
方法一的代码如下
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int sum = 0;//平方和
for(int i = 0; i < 99;i++){
while(a != 0){
sum += (a % 10) * (a % 10);
a = a / 10;
}
System.out.println(sum);
a = sum;
sum = 0;
}
}
}
输入一个正整数,如果不是1即可找到循环圈。
循环圈是:
42
20
4
16
37
58
89
145
方法二的代码如下
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static int max = 0;
static ArrayList arrlist = new ArrayList(); //存下每一次的平方和
static ArrayList quan = new ArrayList(); //循环圈
public static void f(int n){
int sum = 0;
while(n != 0){
sum += (n%10)*(n%10);
n = n/10;
}
if(sum != 0){
if(!arrlist.contains(sum)){ //如果没有出现过该平方和
arrlist.add(sum);
f(sum);
}
else{ //当出现重复的平方和时,代表进入循环圈,继续求平方和,将该循环圈中最大数字找出
//循环一次得出循环圈中的所有数字
do{
quan.add(sum);
n = sum;
sum = 0;
while(n != 0){
sum += (n%10)*(n%10);
n = n/10;
}
}while(!quan.contains(sum));
//遍历循环圈得出最大的数字
for(int i = 0;i < quan.size();i++){
if(max < (int)quan.get(i)){
max = (int)quan.get(i);
}
}
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
f(n);
System.err.println(max);
sc.close();
}
}
运行结果是145
如对该博客有意见或建议,欢迎留言或私信我^ _ ^