原题链接:C语言训练-自守数问题
解题思路:
对于每一个数i,先想办法求出它的位数 digit 。然后算出 (i^2-i)的值,如果它对 (int) pow(10, digit) 求余数为0,那么 i 就是自守数,把它输出。
注意事项:
1,记录(i^2-i)的值,需要用到 long long 数据类型,因为就算是 long 类型 也没有办法储存 200000 的平方;
2,我本来想通过代码 printf("%c%c", 8, 8); 删除后面的两个空格,结果代码却无法通过,所以最后一个数后面的两个空格还是要保留。
参考代码:
#include <stdio.h>
// 因为要用到10的幂积,所以最好包含 math.h 文件。
#include <math.h>
int main()
{
// digit 用来存储数值i的位数,difference 记录差值,tran用来辅助。
int i, j, digit;
long long tran, difference;
for (i=0; i<=200000; i++)
{
for (j=1; j<7; j++)
{
// tran 记录i对10的幂积的商,当tran = 0 时,j就是i的位数。
// 其实这段代码可以很容易找到其他办法代替,读者不妨自己想想。
tran = (int) (i / pow(10, j));
// 记住要用 break 跳出循环。
if (tran == 0)
{
digit = j;
break;
}
}
// 作差。
difference = pow(i, 2) - i;
// 判断差值是否为 10^digit 的整数倍,是的话就是自守数,输出。
// 输出都在后面带上两个空格。
if (difference % (int) pow(10, digit) == 0)
{
printf("%d ", i);
}
}
// 本来想打印两个退格的ASCII的控制字符,但是删除末尾两个空格后代码却无法通过。
// printf("%c%c", 8, 8);
return 0;
} 0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复