原题链接:C语言训练-自守数问题
解题思路:
1.观察自守数:
0-0=0
1-1=0
25-5=20 (5一位数,20末尾1个0)
36-6=30
625-25=600
5776-76=5700 (76两位数,5700末尾2个0)
141376-376=141000 (376三位数,141000末尾3个0)
如果是自守数,他的平方数-自身的差的末尾0的个数一定是该数的位数
注意事项:
1.由于i计算到200000,所以设置存储i^2的变量为longlong类型
2.pow()的返回值类型double
3.%两边是整数
参考代码:
#include<stdio.h>
#include<math.h>
int main()
{
int i,len,a;
long long s; //s比较大,用longlong存储
for(i=0; i<=200000; i++)
{
len=1; //先默认为1位数
s=pow(i,2);
a=i; //由于后面要与i比较,如果不加一个变量a来存储i的值,下面循环对i的操作会改变i的值
while(a>9) //计算数字的位数
{
a/=10;
len++;
}
if(s%(int)pow(10,len) == i) //pow的返回值是double,求余两边只能是整型
printf("%d ",i);
}
return 0;
}
0 分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复