天天看點

C語言初級—水仙花數判斷一個數是不是水仙花數拓展延伸

判斷一個數是不是水仙花數

基本思想:判斷一個數是不是水仙花數,首先要知道什麼是水仙花數

我們将一個 3 位數,它的每個位上的數字的 3次幂之和等于它本身的數稱為水仙花數

例如:153=1^3+5^3+3^3

在編寫程式之前,我們要了解水仙花數的限制條件

首先水仙花數是一個三位數,即其應該滿足100~999

其次就是滿足水仙花數的基本特征

得到判斷水仙花數的函數體如下

result += (int)pow(i % 10, 3);
		i = i / 10;
           

這是水仙花數的判斷基本函數體

接下來要完成要求我們還要用函數将其封裝起來,依據要求,傳回值是正确或者錯誤

是以我們将函數傳回值類型定義為bool類型

得到以下的判斷函數體

bool isflower(int num) {
	int result = 0;
		int i;
		bool flag = false;
		
			i = num;
			
			while (i !=0) {
				result += (int)pow(i % 10, 3);
				i = i / 10;
	
			}
	
			if (result == num)
			{
				flag = true;
			}
			
			return flag;
}
           

其中 i=num;的作用是将num的值記錄并儲存下來,防止在循環前後使用同一個變量會導緻最終的結果産生錯誤。

在完成函數體後,接下來就是在主函數中調用即可

具體代碼如下

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
bool isflower(int num) {
	int result = 0;
		int i;
		bool flag = false;
		
			i = num;
			
			while (i !=0) {
				result += (int)pow(i % 10, 3);
				i = i / 10;
	
			}
	
			if (result == num)
			{
				flag = true;
			}
			
			return flag;
}
int main() {
	int num;
	printf("請輸入一個三位數\n");
	scanf("%d", &num);
	bool result = isflower(num);
	if (result == true) {
		printf("這是一個水仙花數\n");
	}
	else {
		printf("這不是一個水仙花數\n");
	}
	return 0;
}
           

調用函數時用一個與函數傳回值相同的值接收函數傳回結果

再用選擇語句輸出結果

我們用153作為測試用例來檢驗程式正确與否

C語言初級—水仙花數判斷一個數是不是水仙花數拓展延伸

這裡顯示153是一個水仙花數

拓展延伸

以此為基礎,我們可以設計一個程式,一次輸出所有的水仙花數

隻需要加上100~999的循環即可

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main(){
	
	int result=0;
	int i;
	for (int num = 100; num < 1000; num++)
	{
		i = num;
		result = 0;
		while (i !=0) {
			result += (int)pow(i % 10, 3);
			i = i / 10;

		}

		if (result == num)
		{
			printf("%d\n", result);
		}
	}
return 0;

           

 運作程式得到結果

C語言初級—水仙花數判斷一個數是不是水仙花數拓展延伸

其中涉及頭檔案#define _CRT_SECURE_NO_WARNINGS的使用

error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.(這是在不添加頭檔案#define _CRT_SECURE_NO_WARNINGS下使用scanf的錯誤)。

是以根據錯誤我們選擇使用scanf_s代替scanf或者使用頭檔案

但scanf_s在vs上可以運作,但是換成其它編譯器則會出現問題,是以為了友善搬運和代碼複用,我們在使用scanf時應加頭檔案#define _CRT_SECURE_NO_WARNINGS。

pow函數的使用

由于pow函數計算後預設為double類型,是以這裡用(int)進行強制轉換

其次在用pow等其他數學函數時,頭檔案因加上#include<math.h>

繼續閱讀