1. 程式人生 > >輸出0~999999之間的水仙花數

輸出0~999999之間的水仙花數

水仙花數,就是一個n位數的每位數的n次方之和與這個數本身相等,謂之水仙花數。(在一些資料上提到的只有三位數是水仙花數,其他位數有其他的名字,此處不深究,就按照例子上的定義求解水仙花數)

例如153=1^3 + 5^3 + 3^3,再例如1634=1^4 + 6^4 + 3^4 + 4^4。

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main()
{
	int i = 0;
	for (i = 0; i < 1000000; i++)
	{
		int count = 1;
		int tmp = i;
		int sum = 0;
		//計算幾位數
		while (tmp / 10)
		{
			count++;
			tmp /= 10;
		}
		//計算每位數的次方和
		tmp = i;
		while (tmp)
		{
			sum += (int)pow(tmp % 10, count);
			tmp = tmp / 10;
		}
		//比較
		if (i == sum)
			printf("%d ", i);
	}

	system("pause");
	return 0;
}

可以把程式分為三部分去寫:

首先計算當前數為幾位數 ,這裡用tmp/10來實現,每除10就將個位除掉,直至為0,將位數統計下來;這裡重點說明一下count一         開始為什麼從1開始,因為判斷條件是tmp/10,當tmp為1位數時,tmp/10 = 0;此時不執行count++,所以我們可以這樣                認為:     不管是什麼數,最少都會有一位。(此處若是還不能理解,請看最後重新給一個程式碼)

其次計算當前次數的各位數的次方和,具體不分析了,看程式碼;

最後再比較次數與它的各位數次方和是否相等,相等則是水仙花數,輸出即可。

 

最後再給一個程式碼,執行結果一樣,稍加改動

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main()
{
	int i = 0;
	for (i = 0; i < 1000000; i++)
	{
		int count = 0;
		int tmp = i;
		int sum = 0;
		//計算幾位數
		while (tmp )
		{
			count++;
			tmp /= 10;
		}
		//計算每位數的次方和
		tmp = i;
		while (tmp)
		{
			sum += (int)pow(tmp % 10, count);
			tmp = tmp / 10;
		}
		//比較
		if (i == sum)
			printf("%d ", i);
	}

	system("pause");
	return 0;
}

有這麼一句程式碼   sum += (int)pow(tmp % 10, count)

這裡用到了強制型別轉化,這裡將等號右邊的原本為double型別強制轉化為int型別,若沒有進行強制型別轉化,程式執行會報一個警告,此處憑個人意願。