原题链接: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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复