6-11 使用函數輸出水仙花數 (20 分)
水仙花數是指一個N位正整數(N≥3),它的每個位上的數字的N次冪之和等於它本身。例如:153=13+53+33。 本題要求編寫兩個函數,一個判斷給定整數是否水仙花數,另一個按從小到大的順序打印出給定區間(m,n)內所有的水仙花數。
函數接口定義:
int narcissistic( int number );
void PrintN( int m, int n );
函數narcissistic
判斷number
是否為水仙花數,是則返回1,否則返回0。
函數PrintN
則打印開區間(m
, n
)內所有的水仙花數,每個數字占一行。題目保證100≤m
≤n
≤10000。
輸入樣例:
153 400
輸出樣例:
153 is a narcissistic number
370
371
1)實驗代碼
#include <stdio.h>
int narcissistic( int number );
void PrintN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
{
int x,count=0,i,sum=1,a,b=0;
x=number;
while(x!=0)
{
x=x/10;
count++; //這里求n的位數
}
x=number; //初始化x的值 進過while函數后x變化
while(x!=0)
{
a=x%10; //求余
for(i=1;i<=count;i++)
{
sum=sum*a; //余數累乘
}
b=sum+b; //累加
x=x/10; //位數減1
sum=1; //初始化i sum 的值,發現循環里面套循環 end的值會變的很大 sum也是
}
if(b==number)
{
return 1;
}else
{
return 0;
}
}
{
int i; //從m+1位開始
for(i=m+1;i<n;i++)
{ //前面之所以使用x=number 是因為后面需要重置number的值;這里不需要重置
if(narcissistic( i )==1) //滿足條件為真
printf("%d\n",i);
}
}
void真正發揮的作用在於: (1) 對函數返回的限定; (2) 對函數參數的限定。
1、void的含義:
void的字面意思是“無類型”,void *則為“無類型指針”,void *可以指向任何類型的數據。void幾乎只有“注釋”和限制程序的作用,因為從來沒有人會定義一個void變量,讓我們試着來定義:
void a;
這行語句編譯時會出錯,提示“illegal use of type 'void'”。不過,即使void a的編譯不會出錯,它也沒有任何實際意義。
2、void的使用規則:
規則一:如果函數沒有返回值,那么應聲明為void類型
在C語言中,凡不加返回值類型限定的函數,就會被編譯器作為返回整型值處理。但是許多程序員卻誤以為其為void類型。例如:add ( int a, int b ){return a + b;}int main(int argc, char* argv[]){printf ( "2 + 3 = %d", add ( 2, 3) );}
程序運行的結果為輸出:2 + 3 = 5,這說明不加返回值說明的函數的確為int函數。
規則二:如果函數無參數,那么應聲明其參數為void。
在C++語言中聲明一個這樣的函數:
int function(void)
{
return 1;
}
則進行下面的調用是不合法的:
function(2);
因為在C++中,函數參數為void的意思是這個函數不接受任何參數。在Turbo C 2.0中編譯:
#include "stdio.h"
fun()
{
return 1;
}
main()
{
printf("%d",fun(2));
getchar();
}
編譯正確且輸出1,這說明,在C語言中,可以給無參數的函數傳送任意類型的參數,但是在C++編譯器中編譯同樣的代碼則會出錯。在C++中,不能向無參數的函數傳送任何參數,出錯提示“'fun' : function does not take 1 parameters”。
所以,無論在C還是C++中,若函數不接受任何參數,一定要指明參數為void。
3、void具體使用例子:
定義函數返回值 函數名(參數1,參數2,參數3,.......){內容}int sum(int a,int b){int c;return c;}
其中第一個int是返回值 就是別的函數調用此函數時這個函數給他的一個值。
如果調用時不需要返回值,則函數寫為void sum(int a,int b){....} 此時函數沒有返回值如果不需要參數 則int sum(void){...}此時void的意義為空,就是沒有參數的意思如果都不要 則為void sum(void);
擴展資料:
void不能代表一個真實的變量。下面代碼都企圖讓void代表一個真實的變量,因此都是錯誤的代碼:
void a; //錯誤
function(void a); //錯誤
void體現了一種抽象,這個世界上的變量都是“有類型”。
void的出現只是為了一種抽象的需要,如果你正確地理解了面向對象中“抽象基類”的概念,也很容易理解void數據類型。正如不能給抽象基類定義一個實例,我們也不能定義一個void(讓我們類比的稱void為“抽象數據類型”)變量。