1. 程式人生 > >C語言20行程式碼求小於等於10000的所有同構數。

C語言20行程式碼求小於等於10000的所有同構數。

問題:平方後低位的數恰好等於該數的數是同構數。求小於10000的所有同構數。

編譯環境:vc6.0 

#include<stdio.h>
#include<math.h>                                     //呼叫 pow()函式。
void main()
{
    int n,i,m,k;                                     //定義:n為位數,i為迴圈數,
                                                     //m和k為i的平方數(兩者用途不同,k可以用i*i代替)。
    for(i = 1;i <= 10000;i++){                       //迴圈。(範圍為1~10000,可修改)
        k = i * i;
        n = 1;                                       //當平方數小於1時,位數為1.
        m = k;                                           
        while(m >= 10) {n++;m /= 10;}                //算平方數的位數。
        if(n % 2 == 0){                              //當平方數的位數為偶數時。
                                                     //注:此處大括號不可去,否則第二個if會與else對齊。
            if(i == k % (int)pow(10,(n / 2)))        //判斷 i 是否等於 平方數 對 低位的數 取得的餘數。
                printf("%d\n",i);}                   //輸出 i ,若想在輸出平方數,則加上 k 即可。 
        else{                                        //當平方數的位數為奇數時。注:此處大括號可去。
            if(i == k % (int)pow(10,((n + 1) / 2)))
                printf("%d\n",i);}
    } system("pause");                               //vc6.0 需在for迴圈後加上 system("pause"); 
}

關於這一行程式碼:

  if(i == k % (int)pow(10,(n / 2)))

1、k可以用 i*i 代替。

2、取餘符號 % 不能用於浮點數,只能用於整數。

3、pow()函式在vc6.0裡原型為 double pow( double x, double y );  返回值為double型別,故需要轉化為int型。

4、程式碼的意思是 先計算平方數 i*i 的低位位數(即把平方數 向上取 對半分,分為高位數和低位數兩部分,比如數 964852 的低位數為 852,位數即3,;數26547 的低位數為 547 ,位數即 3),然後對平方數對 10 的低位位數次冪

取餘(比如當 k 為 3264 時,取餘後為 64,低位位數次冪為 2),最後與 i 相比較。

5、這裡的pow()函式可用 e+... 來表示10的n次方。

程式碼運算結果為: