雪残风


私信TA

用户名:kongjq

访问量:61

签 名:

排  名 275
经  验 1828
参赛次数 0
文章发表 1
年  龄 0
在职情况
学  校
专  业

  自我简介:

解题思路:

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

  评论区