1. 程式人生 > >判斷一個數是否為水仙花數

判斷一個數是否為水仙花數

原部落格地址

在判斷某一個數是水仙花數之前,我們先介紹一下什麼是水仙花數。

水仙花數(Narcissistic  number)也被稱為超完全數字不變數(pluperfect digital invariant,PPDI)、自戀數、自冪數、阿姆斯壯數或阿姆斯特朗數(Armstrong number),水仙花數是指一個n位數(n>=3),它的每個位上的數字的n次冪之和等於這個數本身(例如:1^3+5^3+3^3=153)

根據這個概念來實現程式碼就比較容易了,有一點小小的困難就是實現一個數的n次冪,這裡我們介紹一個函式來實現此功能。

pow()函式,下面來舉一個簡單的例子,便於對次函式理解。

  1. #include<stdio.h>
  2. #include<math.h>
  3. void main(void)
  4. {
  5. int x = 2;
  6. int y = 3;
  7. int z = 0;
  8. z = pow(x, y);
  9. printf("z=%d", z);
  10. return 0;
  11. }
執行結果:z=8

現在我們可以判斷哪些數都是水仙花數了,程式碼如下。

  1. #include<stdio.h>
  2. #include<math.h>
  3. int main()
  4. {
  5. int i = 0;
  6. for (i = 100; i <= 10000; i++)//找10000以內的水仙花數
  7. {
  8. int tmp = i;//中間變數
  9. int
    sum = 0;//求和
  10. int count = 0;//計數
  11. while (tmp)
  12. {
  13. count++;
  14. tmp /= 10;
  15. }
  16. tmp = i;
  17. while (tmp)
  18. {
  19. sum += pow(tmp % 10, count);//“%”用來取餘數
  20. tmp /= 10;//“/”用來取整,便於計算一個數有多少位
  21. }
  22. if (sum == i)
  23. {
  24. printf("%d\n", sum);
  25. }
  26. }
  27. return 0;
  28. }
執行結果:

到這裡求水仙花數我們就會了。基於這個問題,我們我們還有如下的一個拓展題

問題:如何求Sn=a+aa+aaa+aaaa+aaaaa的前五項之和,其中a是一個數字,例如:Sn=2+22+222+2222+22222

分析:這個問題的規律性挺強,每一項都是前一項乘以10再加第一位,為了讓這個題可擴充套件,我們定義兩個變數a(某一個數),n(前n項),就可以解決了。

程式碼如下:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a = 0;
  5. int n = 0;
  6. int tmp = 0;
  7. int i = 0;
  8. int sum = 0;
  9. scanf("%d%d", &a, &n);
  10. for (i = 0; i < n; i++)
  11. {
  12. tmp = tmp * 10 + a;
  13. sum += tmp;
  14. }
  15. printf("sum=%d\n", sum);
  16. return 0;
  17. }
執行結果: