自守数

来源:互联网 发布:社交网络结尾 编辑:程序博客网 时间:2024/04/30 07:20
#include <stdio.h>#include <stdlib.h>/*自守数,指一个数的平方的尾数等于该数自身的自然数。例如25^2=62576^2=57769376^2=87909376请求出200 000以内的自守数-----------------------------------------------------分析:以376为例376被乘数*   376乘数-------   2256第一部分积=被乘数*乘数的倒数第一位  2632第二部分积=被乘数*乘数的倒数第二位 1128第三部分积=被乘数*乘数的倒数第三位------- 141376本题关心的是积的最后三位。分析产生积德后三位的过程,可以看出:在每一次的部分积中,它不是它的每一位都会对积的后三位产生影响。总结规律可得:在三位数乘法中,对积的后三位产生影响的部分积分别为:第一部分积中:被乘数最后三位*乘数的倒数第一位第二部分积中:被乘数最后两位*乘数的倒数第二位第三部分积中:被乘数最后一位*乘数的倒数第三位将以上的部分积德后三位求和后,截取后三位就是三位数乘积的后三位。这样的规律可以推广到同样问题的不同位数乘积。*/int main(){long mul,number,k,ll,kk;for (number = 0;number<200000;number++){//由number的位数确定截取数字,进行乘法时的系数kfor(mul = number,k = 1;(mul /= 10)>0;k*=10);kk = k*10;//截取部分乘积时的系数mul = 0;//积的最后N位ll = 10;//截取乘数时的系数while(k>0){//(部分积+截取被乘数的后N位*截取乘数的第M位)%kk再截取部分积mul = (mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk;k/=10;//截取被乘数时的系数ll*=10;}if (number == mul){printf("%ld  ",number);}}return 0;}/*number 376k=1000number的"位数"mul = 0kk = 10 000 number的"位数+1"ll = 10mul=(0+(376%(10 000)))*(376%10-376%(10/10))%10000=(0+376*6)%10000=2256%10000=2256  k=100ll=100mul=(2256+(376%(1 000)))*(376%100-376%(100/10))%10000=(2256+376*(76-6))%10000=28576%10000=8576k=10ll=1000mul=(8576+(376%(1 00)))*(376%1000-376%(1000/10))%10000=(8576+76*(376-76))%10000=(8576+76*300)%10000=(8576+22800)%10000=31376%10000=1376*/

原创粉丝点击