6-10 阶乘计算升级版(20 分) 本题要求实现一个打印非负整数阶乘的函数。

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位开始新的一轮计算。

                        


                       

猜你喜欢

转载自blog.csdn.net/liujialing_lala/article/details/80767121