题目:
给你一个数字n,我们把这个数字上的每一位的平方再相加起来再赋值给n,例如123进行这个操作之后会变为14,我们重复这个过程的话数字有可能就会变为1,这认为这个数字的黑洞是1。现在若给你的数字的黑洞是1的话请输出要进行多少步这样的操作给你的n会变为1,若给你的数字最终在某一个数字下循环的话,请输出最后的这个循环数字,(循环的含义见hint样例2)
题解
这道题,我们要用多开一个数组 vis 来记录一下哪些数字已经出现过了,利用 vis 数组的下 标来判断这个数是否出现过,我们用死循环来模拟这个过程,如果 vis 里面已经是 1 了说明 这个数出现过了,直接退出死循环,最终的数是 1 的话就输出循环的次数,不是的话输出最 后这个数字
代码如下
1.简洁的代码
#include<stdio.h>
int vis[1005];
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<=1000;i++)
vis[i]=0;
vis[n]=1;
int cnt=0;
int flag=0;
while(n!=1)
{
cnt++;
int m=n;
n=0;
while(m)
{
n+=(m%10)*(m%10);
m/=10;
}
if(vis[n]==1)
{
flag=1;
break;
}
vis[n]=1;
}
if(flag==0)
printf("%d\n",cnt);
else
printf("%d\n",n);
}
return 0;
}
我的代码:
#include <stdio.h>
int get_sum(int number){
int each,sum=0;
while (number>0){
each=number%10;
sum+=each*each;
number/=10;
}
return sum;
}
int main(){
int number,list[2000],counter=0,flag=0,flag2=0;
while (scanf("%d",&number)!=EOF){
list[0]=number;
for (int i=1;number!=1;i++){
number=get_sum(number);
counter++;
for (int j=0;j<i;j++){
if (list[j]==number){
printf("%d\n",list[j]);
flag=1;
flag2=1;
i=0;
break;
}
}
if (flag==1){
flag=0;
break;
}
list[i]=number;
}
if (flag2==0){
printf("%d\n",counter);
}
counter=0;
flag2=0;
}
return 0;
}
我的代码没有超时真的万幸
作者:NorthCity1984
出处:https://grimoire.cn/acm/black-holl.html
版权:本文《数字黑洞》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
出处:https://grimoire.cn/acm/black-holl.html
版权:本文《数字黑洞》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任