C語(yǔ)言:階乘和數(shù)(正序)
【問(wèn)題描述】
?一個(gè)正整數(shù)如果等于組成它的各位數(shù)字的階乘之和,則該正整數(shù)稱(chēng)為階乘和數(shù)。例如正整數(shù)145,1!+4!+5!等于145,因此145就是一個(gè)階乘和數(shù)。輸入一個(gè)正整數(shù),計(jì)算它的各位數(shù)字的階乘之和,并判斷它是否是一個(gè)階乘和數(shù)。注意:輸入的正整數(shù),以及組成它的各位數(shù)字的階乘之和都不會(huì)超過(guò)int類(lèi)型的表示范圍,并且輸入的正整數(shù)的最高位不為0。
【輸入形式】
?從控制臺(tái)輸入一個(gè)正整數(shù)。
【輸出形式】
先輸出輸入的正整數(shù)和一個(gè)逗號(hào)“,”,并從最高位開(kāi)始輸出組成該正整數(shù)的各位數(shù)字的階乘相加形式,然后輸出等號(hào)“=”和各位數(shù)字階乘之和,最后在下一行輸出字符串“Yes”表示該正整數(shù)是階乘和數(shù),否則輸出字符串“No”表示該正整數(shù)不是階乘和數(shù),輸出Yes或No后輸出回車(chē)換行符。所有輸出字符之間都沒(méi)有空格分隔。
【輸入樣例1】145
【輸出樣例1】
?145,1!+4!+5!=145
?Yes
【輸入樣例2】
?1400
【輸出樣例2】
?1400,1!+4!+0!+0!=27
?No

參考代碼
#include<stdio.h>
//求一個(gè)整數(shù)m的階乘t
int jiecheng(int m)
{
int t=1,i;
for(i=2;i<=m;i++)
t=t*i;
return t;
}
//求一個(gè)整數(shù)n的位數(shù)w
int weishu(int n)
{
int w=0;
while(n)
? ? {
? ? ? ? n=n/10;//每次去掉數(shù)字最后一位
? ? ? ? w++;//循環(huán)一次計(jì)數(shù)器+1
? ? }
? ? return w;
}
//將一個(gè)整數(shù)n各位存儲(chǔ)在一個(gè)數(shù)組中,返回?cái)?shù)組長(zhǎng)度
int toArr(int n,int a[20])
{
int i,len=weishu(n);
for(i=len-1;i>=0;i--)
{
a[i]=n%10;
n=n/10;
}
return len;
}
int main()
{
? ? int i,len,n,s=0,a[20]={0};
//len:數(shù)位數(shù)
? ? scanf("%d",&n);
? ? printf("%d,",n);
len=toArr(n,a);
for(i=0;i<len;i++)
{
s=s+jiecheng(a[i]);
if (i!=len-1)
printf("%d!+",a[i]);
else
printf("%d!",a[i]);
}
printf("=%d\n",s);
if(s==n)
printf("Yes\n");
else
printf("No\n");
return 0;
}