#define MAX 1001 //1001表示這個大數N的階層結果最多只能是1000位,註意 下面的程序是從a[1]開始存數
using namespace std;
/**************
*計算N的階乘
**************
*/
int jisuan(int n,int a[])
{
int i,j; //flag 用來存儲計算結果 除以 4 的余數;
int carry,digit; //digit存儲當前結果的位數,carry為進位
a[1]=1; //初始化第壹位為1,因為最開始是 1,去乘2,3,······n
digit=1; //最開始 只有壹位數--1
for(i=2;i<=n;i++) //循環與2,3,4.....n相乘
{
for(j=1,carry=0;j<=digit;j++) //讓a[]的每位與i相乘
{
a[j]=a[j]*i+carry;
carry=a[j]/10;
a[j]=a[j]%10;
}
while(carry>0) //計算壹輪後,還得檢驗carry的值,如果carry不為0 ,繼續進位
{
a[j]=carry%10;
carry=carry/10;
j++;
}
digit=j-1; //計算壹輪後,將當前的位數賦給digit
}
return digit;
}
/**************
*按格式輸出N的階乘
**************
*/
void shuchu(int digit2,int a[])
{
int i,j,count;//count為輸出4位 後,在輸出壹‘,’的控制變量
if(digit2<=4)//如果計算結果不大於4位,那麽 就沒必要添加逗號,直接輸出計算結果後,返回
{
for(i=digit2;i>=1;i--)
cout<<a[i];//昨天的BUG就是出現在這裏,我把i寫成了 digit
cout<<endl;
return ;//返回,將不會執行下面的語句
}
int flag=digit2%4;
//否則按格式輸出
for(j=1;j<=flag;j++)//余數為幾,那麽就先輸出幾位後,添加壹逗號
{
cout<<a[digit2--];
}
if(flag!=0)//剛剛沒有,這裏是添加的
{
cout<<",";//輸出第壹個逗號
}
//接下了,就4位4位地添加逗號輸出
for(i=digit2,count=1;i>=1;i--,count++)
{
if(count==5)//當將要輸出第5位數時,此時要先輸出壹逗號
{
cout<<",";
count=1;//當壹輪循環結束時,控制變量 記得得從新開始
}
cout<<a[i];
}
cout<<endl;
}
int main()
{
int n;
cout<<"請輸入妳要求的數N:\n";
cin>>n;
int a[MAX];
int digit=jisuan(n,a);
cout<<"******************\n";
cout<<n<<"! 按格式輸出為:";
shuchu(digit,a); //調用題目要求的格式輸出函數
return 0;
}
這個絕對可用且很好,老師驗收過的。