625这个数字很特别,625的平方等于390625,刚好其末3位是625本身。除了625,还有其它的3位数有这个特征吗?
请编写程序,寻找所有这样的3位数:它的平方的末3位是这个数字本身。输出结果中,从小到大,每个找到的数字占一行。比如那个625就输出为:
625
分析:
思路1:采用数字平方后在对比后3位程序简单且不容易出错,但效率低;稍作优化,只有当最后1位为0,1,5,6时条件才有可能成立,由此可排除一些数字。
思路2:当数字位数增多时,按思路1很快会导致乘法溢出,并且其效率也不高,根据乘法特点(被乘数的每1位分别乘以乘数,并将结果相加即可求出乘积),只需将被乘
数的每1位乘以乘数,并将结果相加即可求出相应位的乘积值,如果该位不等于乘数的该位则说明此数不满足条件,如:54325*54325
5 4 3 2 5
*5 4 3 2 5
------------------------------
2 7 1 6 2 5
1 0 8 6 5 0
1 6 2 9 7 5
-------------------------------
6 2 5
由于乘积倒数第3位6与乘数对应位3不等,说明此数不满足条件。
解:
#include <stdio.h>
void ZiShou(int min, int max)
{
int i; //待测试数字
int n; //待测试数字副本
int sum; //累加和
int n0; //依次暂存待测数字每一位
for(i=min; i<=max; i++)
{
n = i;
sum = 0;
while(n>0)
{
n0 = n%10;
sum += n0*i;
if(sum%10 != n0) //此位不相等?
break;
sum = sum/10;
n = n/10;
}
if(n<=0) //是自守数?
printf("%d\n", i);
}
}
int main(int argc, int *argv[])
{
int min, max;
printf("请输入数字范围(数字以空格(或回车)间隔)......\n");
scanf("%d %d", &min,&max);
ZiShou(min, max);
return 0;
}