PTA题目:6-10 阶乘计算升级版 答案+解析

PTA题目:6-10 阶乘计算升级版 答案+解析

  • 题目概览
  • 分享答案(是转载的)
  • 图解说明
    • 看成竖式计算理解

题目概览

题目网址:https://pintia.cn/problem-sets/14/problems/742
题目内容:

函数接口定义:
void Print_Factorial ( const int N );
其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。

裁判测试程序样例:
#include 

void Print_Factorial ( const int N );

int main()
{
    int N;
	
    scanf("%d", &N);
    Print_Factorial(N);
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:
15
输出样例:
1307674368000

我一开始遇到这道题的时候是没啥想法的,唯一能想到的就是用算法模拟竖式计算,达到大数乘法的效果,但是下手比较很难,其实接下来介绍的算法确实可以看成模拟竖式计算的,但是和一般的竖式计算有所不同,并且根据实际情况,不一定要模拟得那么标准。

分享答案(是转载的)

void Print_Factorial(const int N){
     
	if(N < 0) printf("Invalid input\n");
	else if(N == 0) printf("1\n");
	else{
     
		int number[10000]={
     0}; number[0] = 1;
		int right = 0, num, carry=0;
		for(int n = 2; n <= N; ++n){
     
			for(int r = 0; r <= right; ++r){
     
				num = number[r] * n + carry;
				number[r] = num % 10;
				carry = num / 10;
			}
			while(carry){
     
				right ++;
				number[right] = carry %10;
				carry/=10;
			}
		}
		for(int r = right ; r >=0 ; --r){
     
			printf("%d", number[r]);
			// printf(" right: %d", right);
		}
	}
 
}

作者:小李34234324
来源:CSDN
原文:https://blog.csdn.net/ppslizejun/article/details/51638015

图解说明

flowchart写的流程图:

Created with Raphaël 2.2.0 开始 n<0? printf("Invalid input\n") 打印number[ ] 结束 n=0? printf("1\n") 定义变量:number[0]=1;n;num;r;carry=0;right=0. (for循环) n=2(初始) n<=N? r=0(初始) r<=right?(for循环) num = number[r] * n + carry number[r] = num % 10; carry = num / 10; r++(尾) carry>0?(while循环) right ++ number[right] = carry %10 carry/=10 n++ yes no yes no yes no yes no yes no

上面那个图可能效果不是太好
Mermaid 语法写的流程图:

外层循环
内循环001
内循环002
否(n大于0的情况)
n=2
n<=N?(外层循环)
r=0
r<=right?(for循环)
carry>0?(while循环)
num = number[r] * n + carry
number[r] = num % 10;
carry = num / 10;
r++(尾)
n++(外层循环的尾部)
right ++
number[right] = carry %10
carry/=10
开始
n<0?
打印:”Invalid inputr“
打印number[ ]
n=0?
打印结果:1
定义变量:number[0]=1;n;num;r;carry=0;right=0
结束

其实关键是外面的那个大循环,用word做的流程图(上图的外层循环部分,已判断为N为大于0的情况):
对应的代码片段:

		int number[10000]={
     0}; number[0] = 1;
		int right = 0, num, carry=0;
		for(int n = 2; n <= N; ++n){
     
			for(int r = 0; r <= right; ++r){
     
				num = number[r] * n + carry;
				number[r] = num % 10;
				carry = num / 10;
			}
			while(carry){
     
				right ++;
				number[right] = carry %10;
				carry/=10;
			}
		}
		for(int r = right ; r >=0 ; --r){
     
			printf("%d", number[r]);
			// printf(" right: %d", right);
		}

定义的变量:number[0]=1;n;num;r;carry=0;right=0

PTA题目:6-10 阶乘计算升级版 答案+解析_第1张图片
自己的理解:
PTA题目:6-10 阶乘计算升级版 答案+解析_第2张图片

看成竖式计算理解

前面已经说过,这个可以理解成竖式计算,但是与一般的竖式计算不同,那就是每一步乘的数n不必拆成个位,十位等来计算,如下,假设已得结果32430725,n=13:
PTA题目:6-10 阶乘计算升级版 答案+解析_第3张图片
一般的竖式大家都会,为了说得更加清楚一点,下面详细说明程序的各个部分对应竖式运算的哪几个部分:
PTA题目:6-10 阶乘计算升级版 答案+解析_第4张图片
话不多说了,相信大家仔细看图解能看懂,祝大家学习愉快,感谢大家的时间。

你可能感兴趣的:(程序题目解析)