幸运数的定义与判断


前言

前几天作为我校一场比赛的压轴题出场,但可以通过骗分得到可观的分数,本人所用方法虽不是骗分,但本质上也是骗过系统得分。

  • 原题链接:牛客网幸运数
  • 幸运数的定义
    1、对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
    2、然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
    3、如果这个过程 结果为 1,那么这个数就是幸运数。

e.g:

19–>1,9
1²+9²=82
82–>8,2
8²+2²=68
68–>6,8
6²+8²=100
100–>1,0,0
1²+0²+0²=1
此时和为1,无需再往下运算,可认为19为幸运数

判断思路
1.在输入相应的n值后,利用while循环以及计数器算出该数为几位数
2.利用数组a[some]存放该数的每一位
3.通过for循环将此时的各位数平方求和,同时讲该值赋给n,让n进入下一次循环(在赋给n的同时定义的求和sum也要清零
4.

  • 在每次循环结束前判断n是否为1,若为1则停止循环,输出true
  • 若不为幸运数,则需要在进行无数次循环后跳出循环,所以我们要引入新的计数器cnt2来记录循环次数,在计数器达到某一特定值时选择终止循环,并输出false,该方法仅适用于一些数比较小的情况

二、使用步骤

1.引入库

#include <stdio.h>

2.读入数据

代码如下:

#include <stdio.h>
int a[1000];
int main ()
{
int n;
scanf("%d",&n);
int cnt = 0,cnt2 = 0;
int sum = 0;
while(n != 0)
{
cnt2++;
while(n!=0)
{
a[cnt++] = n%10;
n /= 10;
}
int i;
for(i =0;i < cnt;++i)
{
sum += a[i]*a[i];
}
n = sum;
sum = 0;
cnt = 0;
if( n == 1)
{
printf("true");
break;
}
if(cnt2==30)
break;
}
if(cnt2==30)
printf("false");
}

总结

通过骗过系统的测试点来得到分,虽无耻,但有用

胸针骗过世界来到石头门线,我骗过系统拿到满分,本质不是一样的嘛