C趣味编程百例(08)自守数
27.自守数
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:
252 = 625 762 = 5776 93762 = 87909376
要求20万以内的自含数
*题目分析与算法设计
如果采用“求一个数的平方,然后截取最后一个对应数字”的方法,显然
分析手动模式下整数平方(乘法)的计算过程, 以376为例:
376被乘数
X 376乘数
-
2256第一个部分积=被乘数的最后一位*乘数
2632第二个部分积=乘数的最后三位
-
141376乘积
这个问题关心的是乘积的最后三位。 通过分析产生乘积后三位数的过程可以看出,并不是部分乘积的每一位数都会影响乘积的后三位数。规律可以概括为:在三位数乘法中,影响乘积最后三位数的部分乘积是:
在第一个部分乘积中:被乘数的最后三位数*乘数的最后一位数
在第二个部分乘积中:被乘数的最后两位数*乘数的最后一位数
在第三个部分乘积中:被乘数的最后一位数*。这个规律可以推广到同一个问题的不同位数的乘积。
可以按照手工计算的流程设计算法,编写程序。
*程序描述和注释
# include
void main()
{
long mul,number,k,ll,kk;
printf("它存在于小于200000的自同构成员之后:\ n ");
for(number = 0;number {
for(mul=number,k = 1;(mul/= 10)> 0;k * = 10);
/*截取数字进行乘法运算时的系数k*/
kk=k*10由位数决定;/*kk是部分积截尾时的系数*/
mul = 0;/* product */
ll的后n位= 10;/*ll是系数*/
,而(k > 0)
{
mul =(mul+(number %(k * 10))*(number % ll-number %(ll/10))%)
/*(部分乘积+被截被乘数的最后n位*被截乘数的第m位),%kk截取部分乘积*/
k/= 10;/*k是截取被乘数*/
ll*=10时的系数;
}
if(number==mul) /*如果是自含数,则输出*/
printf("%ld ",number);
}
}
*运行结果
表示以下小于200000的车身数字:
0 1 5 6 25 76 376 625 9376 90625 109376
0条评论