https://pintia.cn/problem-sets/14/problems/742
#include <stdio.h>
void Print_Factorial ( const int N );
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
void Print_Factorial(int N){
int a[3000];
int temp,num,digit; //temp:每一位的结果 num:进位 digit:结果的位数
int i,j;
a[0]=1;
digit=1; //从第1位开始
if(N>=0) {
for(i=2;i<=N;i++){
num=0;
for(j=0;j<digit;j++){
temp=a[j]*i+num;
a[j]=temp%10; //把当前位的数字存入数字
num=temp/10; //向前面一位进位
}
while(num){ //当i的阶乘算完,任有进位,则数组需扩大
a[digit]=num%10;
num/=10;
digit++;
}
}
for(i=digit-1;i>=0;i--){
printf("%d",a[i]);
}
}
else printf("Invalid input");
}
这个题目就是大数相乘,用数组存储的一个题目:
核心思想就是:对于0到N,变量i是需要与数组的每一位都要相乘的,而且从低位开始相乘。
对于数组中的每一位,它所存储的数是:(与i相乘+进位)%10。
此外要注意:
当你在计算的过程中,肯定要时时刻刻都清楚当前的数组真实的长度吧,所以在这里引进了变量digit,当数组的最高位有进位时,就要根据进位去扩大数组了去存储了。
当每一次乘以i时,变量num都需要重新赋值为0,因为相当于又从最低位0位开始新的一轮计算。