MENU

数字黑洞

April 4, 2020 • Read: 403 • 题解

题目:

给你一个数字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;
}

我的代码没有超时真的万幸

Archives Tip
QR Code for this page
Tipping QR Code