自守数Exp03-Extend01,GJBook3-12-04

今天遇到了一道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;
}


}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值