52 = 25 252 = 625 762 = 5776 93762 = 87909376
求100000以內的自守數。int main () { //... while(k>0) { mul=( mul + ( number%(k*10) )*( number%b - nxuober%(b/10) ) )%a; /* (部分積+擷取被乘數的後N位*擷取乘數的第M位),%a再擷取部分積*/ k /= 10; /*k為擷取被乘數時的係數*/ b *= 10; } //... return 0; }對於整個迴圈來說,變數k是由number的位數確定擷取數位進行乘法時的係數。第1次執行迴圈體時,被乘數的所有位數都影響到平方的尾數,因此第1個部分積=被乘數*乘數的最後一位,將部分積累加到變數mul上,再對a取餘擷取相應的尾數位數;第2次執行迴圈體,影響平方尾數的是被乘數中除了最高位之外的數(所以k先除以10再參加運算),第2個部分積=被乘數*乘數的倒數第二位,( number%b - number%(b/l0) )用來求乘數中影響平方尾數的對應位上的數;第3次、第4次執行迴圈體的過程同上。
#include<stdio.h> int main() { long mul, number, k, a, b; printf("It exists following automorphic nmbers small than 100000:n"); for( number=0; number<100000; number++ ) { for( mul=number, k=1; (mul/=10)>0; k*=10 ); /*由number的位數確定擷取數位進行乘法時的係數k*/ a = k * 10; /*a為擷取部分積時的係數*/ mul = 0; /*積的最後n位*/ b = 10; /*b為擷取乘數相應位時的係數*/ while(k>0) { mul=( mul + ( number%(k*10) )*( number%b - number%(b/10) ) )%a; /*(部分積+擷取被乘數的後N位*擷取乘數的第M位),%a再擷取部分積*/ k /= 10; /*k為擷取被乘數時的係數*/ b *= 10; } if(number == mul) /*判定若為自守數則輸出*/ printf("%ld ", number); } printf("n"); return 0; }執行結果: