華為OJ軟件訓(xùn)練題(中級(jí))――可怕的階乘(大數(shù)處理)
來源:程序員人生 發(fā)布時(shí)間:2015-05-26 07:51:21 閱讀次數(shù):5667次
題目標(biāo)題:
- 計(jì)算階乘n!是1件可怕的事情,由于當(dāng)n其實(shí)不是很大時(shí),n!將是1個(gè)很大的值。例如13! = 6227020800,已超過了我們經(jīng)常使用的unsigned int類型的取值范圍。請(qǐng)?jiān)O(shè)計(jì)1個(gè)程序,使其可以計(jì)算100之內(nèi)的數(shù)的階乘,結(jié)果用字符串的情勢(shì)輸出
詳細(xì)描寫:
原型:
void CalcNN(int n, char *pOut)
輸入?yún)?shù):
int n 需要計(jì)算的階乘數(shù)
輸出參數(shù):
char *pOut 結(jié)算結(jié)果,內(nèi)存由調(diào)用者負(fù)責(zé)管理
返回值:
無
限制:
無
舉例:
對(duì)此這類類型題目基本考察的都是大整數(shù)計(jì)算,還有整數(shù)和字符之間轉(zhuǎn)換,仔細(xì)就好,沒有復(fù)雜的算法思想。
#include<iostream>
//#include<string>
//#include<algorithm>
//#include<cmath>
//#include<vector>
//#include<stack>
//#include<iomanip>
using namespace std;
void CalcNN(int n, char *pOut)
{
int i=0,j;
int c,tmp=n,slen;
char ct;
if(n==0 || n==1)
{
pOut[0]='1';
pOut[1]=0;
return;
}
while(tmp)
{
pOut[i++]=(tmp%10)+'0';
tmp=tmp/10;
}
pOut[i]=0;
slen=strlen(pOut);
//cout<<slen<<endl;
for(i=n⑴;i>1;i--)
{
c=0;
for(j=0;j<slen;j++)
{
tmp=i*(pOut[j]-'0')+c;
if(tmp>9)
{
pOut[j]=(tmp%10)+'0';
c=tmp/10;
}
else
{
pOut[j]=tmp+'0';
c=0;
}
}
if(c!=0)
{
while(c)
{
pOut[slen++]=(c%10)+'0';
c/=10;
}
pOut[slen]=0;
}
// cout<<i<<" "<<pOut<<endl;
}
for(i=0,j=slen⑴;i<j;i++,j--)
{
ct=pOut[j];
pOut[j]=pOut[i];
pOut[i]=ct;
}
return;
}
int main()
{
char *ss=(char *)malloc(1000*sizeof(char));
CalcNN(13, ss);
cout<<ss<<endl;
return 0;
}
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)