解题思路:

对于每一个数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;
}

点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论