今天遇到了一道C语言中等题吧,难在数据量开的贼大,必须用到long long才能过案例,然测试点也比较夸张,总共五个测试点,博主小菜鸡只过了三个,两个未过的都是自守数输出到9376,其实自守数不止到9376,应该是没在规定时间内跑完,希望有大佬指点。
更新:评论区说x,i改成long long能满足所有案例。
题目描述:若一个正整数a满足条件 a^2 的尾数等于a,则称a为自守数,例如:
25^2=625 、76^2=5776 、9376^2=87909376 都是自守数。
编写程序,求小于等于n的所有自守数。
输入:从键盘随机输入一个正整数n(<10000000)。
输出:输出小于n的所有自守数,每个数之间以一个西文空格间隔。
样例1:
输入:10
输出:1 5 6
样例2:
输入:100
输出:1 5 6 25 76
题解:
#include<stdio.h>
#include<stdbool.h>
bool check(long long x)//判断自守数
{
long long m=x*x;
if(x==1) return true;//1是自守数
long long n=m,k=1;
long long sum=0;
//数据平方的后面部分,不断更新,与语句匹配,匹配上即是自守数。
while(n>0)
{
sum+=(n%10)*k;
n/=10;
k*=10;
if(sum==x) return true;//匹配上,直接结束
if(sum>x) return false;//sum已经比数据大了,肯定不是自守数了,结束,避免无意义的循环。
}
return false;
}
int main()
{
long long n0;
long long i;
scanf("%lld",&n0);
printf("1");//先输1是为了维持规定的输出格式
for(i=4;i<n0;i++)
{
if(check(i)) printf(" %lld ",i);
}
return 0;
}
}