本題要求實現(xiàn)一個打印非負整數(shù)階乘的函數(shù)。
函數(shù)接口定義:
void Print_Factorial ( const int N );
其中N是用戶傳入的參數(shù),其值不超過1000。如果N是非負整數(shù),則該函數(shù)必須在一行中打印出N!的值,否則打印“Invalid input”。
程序樣例
#include <stdio.h>
void Print_Factorial(const int N);
int main()
{
int N;
scanf_s("%d", &N);
Print_Factorial(N);
getchar();
getchar();
return 0;
}
/* 你的代碼將被嵌在這里 */
void Print_Factorial(const int N)
{
int i;
int sum=1;
if (N >= 0&&N<=12)
{
if (N == 0)
sum = 1;
else
for (i = 1; i <= N; i++)
sum = sum*i;
printf("%d\n", sum);
}
else if (N > 12 && N <= 1000)
{
int num[3000] = { 0 }; //用于存儲最終結(jié)果數(shù)據(jù)
int k = 1; //位數(shù)
int n = 0; //進位
int i, j, x, temp;
num[0] = 1; //結(jié)果初始化1
for (i = 2; i <= N; i++) //從2開始階乘 數(shù)據(jù)結(jié)果逆序存放
{
for (j = 0; j < k; j++) //將臨時結(jié)果的每一位與階乘數(shù)值相乘
{
temp = num[j] * i + n; // 每一位分別作階乘
num[j] = temp % 10; //更新末位數(shù)值
n = temp / 10; //更新進位數(shù)值
}
while (n != 0)
{
num[k] = n % 10; //更新進位數(shù)據(jù)
n /= 10;
k++; //更新進位位數(shù)
}
}
for (x = k - 1; x >= 0; x--) //數(shù)據(jù)輸出
printf("%d", num[x]);
}
else
printf("Invalid input");
}
這個題目提交了好多次,開始以為是基礎(chǔ)的階乘題目,但是提交后發(fā)現(xiàn)永遠是部分正確,只得15分,起初以為是輸出printf函數(shù)的問題,修改后還是部分正確,最終查找了幾個CSDN博客才找到源碼,水平較渣,源碼看了好久才看明白。
這個問題中,由于1000!大約有3000位數(shù)值,所以只能通過構(gòu)造數(shù)組的形式來實現(xiàn)對結(jié)果的存儲。
int 型占在32位上位機上占據(jù)32個字節(jié),所以最大值時2的32次方=4294967296(無符號),帶符號再除以2,負數(shù)比正數(shù)多一個,便得出取值范圍-2147483648~+2147483647。又由于13!=6 227 020 800,已經(jīng)超出了最大值,所以在計算13以后的階乘時采用數(shù)組方式解決問題。