的階乘它是在一個網站的測試,這裏是代碼是計算大數
#include <stdio.h>
void Print_Factorial (const int N);
int main()
{
int N;
scanf("%d",&N);
Print_Factorial(N--);
return 0;
}
/* your code will be put in here*/
#include <math.h>
int getFactLength(int N){
double length = 0;
while(N){
length += log10(N--);
}
return (int)length+1;
}
void printFact(int fact[], int length){
while(length--){
printf("%d",*fact++);
}
}
void initialNums(int nums[], int length, int num){
while(length--){
*nums++ = num;
}
}
void Print_Factorial(const int N){
if(N < 0){
printf("Invalid input");
return ;
}
int NT = N;
if(NT>=0 && NT<15){
int fact = 1;
while(NT){
fact *= NT--;
}
printf("%d",fact);
return ;
}
int length = getFactLength(N);
int fact[length];
initialNums(fact, length, 0);
fact[length-1] = 1;
int lastNoneZeroIndex = length-1;
while(NT > 1){
int lengthT = length;
int carry = 0;
while(lengthT-- > lastNoneZeroIndex){
int result = NT*fact[lengthT] + carry;
fact[lengthT] = result % 10;
carry = result/10;
}
while(carry){
fact[--lastNoneZeroIndex] = carry % 10;
carry /= 10;
}
NT--;
}
printFact(fact, length);
}
我使用0
到20
值進行測試,所有的人都是正確的程序。但是當我在該網站上提交它時,測試用例總是不通過。我不知道那是什麼情況。但是,有5個案例,所有測試案例都在0到1000之間,其中兩個不超過15個,其中一個是否定的,其中一個使用最多時間通過,所以我認爲未通過的案例是一個小於1000的數字。這就是我所知道的,我無法想象1000個通過了,但小於1000的數字沒有通過。我不知道我可愛的代碼有什麼問題。我希望你能看我的代碼,並找到一些錯誤。
嘗試測試你的大投入方案了。例如,您是否檢查過,如果輸入爲100,您的程序將返回93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000? – Ilya
你的程序實際上計算1000!正確。我相信你有一個格式問題。 –
在階乘後不打印新行。也許自動chacker期待這一點。 (一個新行也會刷新輸出。) –