自守數
自守數是指一個數的平方的尾數等於該數自身的自然數,如25*25=625,76*76=5776.要求求出一定范圍內的所有自守數。
題目分析:
剛拿到這個題目的時候認為解題關鍵在於,測試該數平方數的尾數和該數自身的自然數相等問題。導出新問題如何求出該平方數的尾數,要取和自然數位數相同的位數該怎么取。
看了一下標准答案如下,表示細節方面看不懂,貼出如下:
- #include<stdio.h>
- int main(void)
- {
- long i, j, k1, k2, k3, a[10] = {0}, num, m, n, sum; /*定義變量及數組為長整形*/
- printf("請輸入一個數表示范圍:\n");
- scanf("%ld", &num); /*從鍵盤中輸入要求的范圍*/
- printf("結果是:");
- for (j = 0; j < num; j++) /*對該范圍內的數逐個試探*/
- {
- m = j;
- n = 1;
- sum = 0;
- k1 = 10;
- k2 = 1;
- while (m != 0) /*判斷該數的位數*/
- {
- a[n] = j % k1; /*分離出的數存入數組中*/
- n++; /*記錄位數,實際位數為n-1*/
- k1 *= 10; /*最小n位數*/
- m = m / 10;
- }
- k1 = k1 / 10;
- k3 = k1;
- for (i = 1; i <= n - 1; i++)
- {
- sum += (a[i] / k2 * a[n - i]) % k1 * k2; /*求每一部分積之和*/
- k2 *= 10;
- k1 /= 10;
- }
- sum = sum % k3; /*求和的后n-1位*/
- if (sum == j)
- printf("%5ld", sum); /*輸出找到的自守數*/
- }
- printf("\n");
- return 0;
- }
效果圖如下:

不過看到數組后產生靈感,想了個辦法用while循環結合一個變量來統計自然數的位數,然后求出10的位數平方,用平方數對其求余再和自然數比較,並采用了模塊化設計。
代碼如下:
- #include<stdio.h>
- int ss(long);
- int main(void)
- {
- int i;
- long sum;
- scanf("%ld",&sum);
- for(i=0;i<=sum;i++)
- {
- if(ss(i)) //判斷是否符合要求
- printf("%d ",i);
- }
- printf("\n");
- return 0;
- }
- int ss(long value)
- {
- int i,n=0,k=1;
- long temp=value,result; //用long型防止溢出,用一個temp來復制變量,保留一個原樣。
- long ch=value*value; //求平方數
- while(temp!=0)
- {
- n++; //統計自然數的位數
- temp/=10;
- }
- for(i=0;i<n;i++)
- k=k*10; //求出取余的數
- result=ch%k; //求余
- if(value==result) //測試
- return 1;
- return 0;
- }
效果圖如下:

個人覺得對比給出的標准答案改進有
一、代碼行數減少了
二、進行了模塊化設計
三、未使用數組
四、更易理解
