Problem K. S08-17 大数阶乘(高精度乘法问题,简单初学版)

8.17(选做)挑战类型表示的极限——大数的存储问题。编程计算并输出1~40之间的所有数的阶乘。提示:用一个包含50个元素的数组存储一个大数,每个数组元素存储大数中的一位数字
此题为中难题,可参考提示部分,请阅读后充分掌握。

输入

一个不大于40的正整数n

输出

输出1~n所有的阶乘

样例

标准输入复制文本
21
标准输出复制文本
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
标准输入复制文本
40
标准输出复制文本
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 10888869450418352160768000000
28! = 304888344611713860501504000000
29! = 8841761993739701954543616000000
30! = 265252859812191058636308480000000
31! = 8222838654177922817725562880000000
32! = 263130836933693530167218012160000000
33! = 8683317618811886495518194401280000000
34! = 295232799039604140847618609643520000000
35! = 10333147966386144929666651337523200000000
36! = 371993326789901217467999448150835200000000
37! = 13763753091226345046315979581580902400000000
38! = 523022617466601111760007224100074291200000000
39! = 20397882081197443358640281739902897356800000000
40! = 815915283247897734345611269596115894272000000000

解题思路:

     一眼鉴定为高精度问题,数组利用进位解决大数输出问题。(注意删除前导零以及逆置输出)

#include <bits/stdc++.h>
using namespace std;
#define N 5000
int s[N]= {0};
int n,t=1;
int main() {
	s[t]=1;
	cin>>n;
	
	for(int i=1; i<=n; i++) {
		cout<<i<<"! = ";//外循环表示哪一个数的阶乘
		for(int j=1; j<=t; j++) {
			s[j]*=i;//计算阶乘
		}
		
		//进位处理,应熟练掌握
		for (int k=1; k<=t; k++) {
			if (s[k] >= 10) 
			{ 
				s[k+1]+=s[k]/10; 
				s[k]%=10; 
				t++;
			}
		}
		//小技巧删除前导零(如果做题遇到删除后导零之类的的话就正序即可)
		for(int l=t; l>0; l--) {
			if(s[l]==0){
				t--;//此下标不输出
			}
			else
			{
				break;//当遇到第一个非零的数时停止操作,防止后导零被误删
			}	
		}
		
		for(int j=t;j>0;j--){
			cout<<s[j];//逆置输出
		}
		
		cout<<endl;//别忘了哦!
	}
	return 0;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值