一个计算大数阶乘的程序
A program that calculate the factorial of big number
在网站上测试,代码如下
#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的数字没有通过。我不知道我可爱的代码有什么问题。我希望你能看我的代码,并发现一些错误。
事实变量产生溢出,这里使用int类型作为事实变量。
对于输入 13,14,它给出了错误的答案。
解决方案:
long long int fact = 1;
或者,
更改条件- if(NT>=0 && NT<13)
在网站上测试,代码如下
#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的数字没有通过。我不知道我可爱的代码有什么问题。我希望你能看我的代码,并发现一些错误。
事实变量产生溢出,这里使用int类型作为事实变量。 对于输入 13,14,它给出了错误的答案。
解决方案:
long long int fact = 1;
或者,
更改条件- if(NT>=0 && NT<13)