python自守數 C語言求自守數(詳解版)

2021-10-11 12:51:35 字數 2125 閱讀 1080

自守數是指乙個數的平方的尾數等於該數自身的自然數。例如:

52 = 25    252 = 625    762 = 5776    93762 = 87909376

求100000以內的自守數。

問題分析

根據自守數的定義,求解本題的關鍵是知道當前所求自然數的位數,以及該數平方的尾數與被乘數、乘數之間的關係。

演算法設計

若採用「求出乙個數的平方後再擷取最後相應位數」的方法顯然是不可取的,因為計算機無法表示過大的整數。

分析手工方式下整數平方(乘法)的計算過程,以376為例:

本問題所關心的是積的最後三位。分析產生積的後三位的過程可以看出,在每一次的部分積中,並不是它的每一位都會對積的後三位產生影響。總結規律可以得到:在三位數乘法中,對積的後三位產生影響的部分積分別為:

第乙個部分積中:被乘數最後三位×乘數的倒數第一位。

第二個部分積中:被乘數最後二位×乘數的倒數第二位。

第三個部分積中:被乘數最後一位×乘數的倒數第三位。

將以上的部分積的後三位求和後,擷取後三位就是三位數乘積的後三位,這樣的規律可以推廣到同樣問題的不同位數乘積中。

分離給定數中的最後幾位

從乙個兩位數(存在變數n中)開始分析,分離最低位個位n%10;對於三位數n,分離最後兩位n%100;對於四位數n,分離最後三位n%1000;...,由此可見,若分離出最後x位,只需要用原數對 10x 求餘。

從第3部分所舉例子可以看出,對於第二個部分積「2632」來說其實應是「26320」, 因為對於乘數中的倒數第二位「7」來說,因其在十位,對應的權值為10,第二個部分積實質上為:376x70=26320。故求部分積的程式段為:

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

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;

執行結果:

it exists following automorphic nmbers small than 100000:

0   1   5   6   25   76   376   625   9376   90625

關於 自守數 的C語言演算法

自守數 是指乙個數的平方的尾數等於該數自身的自然數。include include main for b 1,c 0 b count b k pow 10,count j c k if j i printf ld i printf n 因為計算機無法表示過大的整數,所以無法採用 求出乙個數的平方後再...

1091 N 自守數(C語言)

如果某個數 k 的平方乘以 n 以後,結果的末尾幾位數等於 k,那麼就稱這個數為 n 自守數 例如 3 92 2 25392,而 25392 的末尾兩位正好是 92,所以 92 是乙個 3 自守數。本題就請你編寫程式判斷乙個給定的數字是否關於某個 n 是 n 自守數。輸入在第一行中給出正整數 m 2...

華為初級 自守數

描述 自守數是指乙個數的平方的尾數等於該數自身的自然數。例如 25 2 625,76 2 5776,9376 2 87909376.請求出n以內的自守數的個數 介面說明 原型 unsigned int calautomorphicnumbers unsigned int n 輸入引數 unsigne...