C語言之自守數


自守數

     自守數是指一個數的平方的尾數等於該數自身的自然數,如25*25=625,76*76=5776.要求求出一定范圍內的所有自守數。

題目分析:

剛拿到這個題目的時候認為解題關鍵在於,測試該數平方數的尾數和該數自身的自然數相等問題。導出新問題如何求出該平方數的尾數,要取和自然數位數相同的位數該怎么取。

看了一下標准答案如下,表示細節方面看不懂,貼出如下:

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. long i, j, k1, k2, k3, a[10] = {0}, num, m, n, sum;            /*定義變量及數組為長整形*/
  5. printf("請輸入一個數表示范圍:\n");
  6. scanf("%ld", &num);                        /*從鍵盤中輸入要求的范圍*/
  7. printf("結果是:");
  8. for (j = 0; j < num; j++)                 /*對該范圍內的數逐個試探*/
  9. {
  10. m = j;
  11. n = 1;
  12. sum = 0;
  13. k1 = 10;
  14. k2 = 1;
  15. while (m != 0)                        /*判斷該數的位數*/
  16. {
  17. a[n] = j % k1;                     /*分離出的數存入數組中*/
  18. n++;                                 /*記錄位數,實際位數為n-1*/
  19. k1 *= 10;                            /*最小n位數*/
  20. m = m / 10;
  21. }
  22. k1 = k1 / 10;
  23. k3 = k1;
  24. for (i = 1; i <= n - 1; i++)
  25. {
  26. sum += (a[i] / k2 * a[n - i]) % k1 * k2;                 /*求每一部分積之和*/
  27. k2 *= 10;
  28. k1 /= 10;
  29. }
  30. sum = sum % k3;                     /*求和的后n-1位*/
  31. if (sum == j)
  32. printf("%5ld", sum);                /*輸出找到的自守數*/
  33. }
  34. printf("\n");
  35. return 0;
  36. }

效果圖如下:

不過看到數組后產生靈感,想了個辦法用while循環結合一個變量來統計自然數的位數,然后求出10的位數平方,用平方數對其求余再和自然數比較,並采用了模塊化設計。

代碼如下:

  1. #include<stdio.h>
  2. int ss(long);
  3. int main(void)
  4. {
  5. int i;
  6. long sum;
  7. scanf("%ld",&sum);
  8. for(i=0;i<=sum;i++)
  9. {
  10. if(ss(i))                                         //判斷是否符合要求
  11. printf("%d ",i);
  12. }
  13. printf("\n");
  14. return 0;
  15. }
  16. int ss(long value)
  17. {
  18. int i,n=0,k=1;
  19. long temp=value,result;               //用long型防止溢出,用一個temp來復制變量,保留一個原樣。
  20. long ch=value*value;                  //求平方數
  21. while(temp!=0)     
  22. {
  23. n++;                                        //統計自然數的位數
  24. temp/=10;
  25. }
  26. for(i=0;i<n;i++)
  27. k=k*10;                                  //求出取余的數
  28. result=ch%k;                          //求余
  29. if(value==result)                      //測試
  30. return 1;
  31. return 0;
  32. }

效果圖如下:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM