码迷,mamicode.com
首页 > 其他好文 > 详细

阶乘计算

时间:2020-02-06 14:14:25      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:col   --   problem   while   高精度计算   hellip   精度   ++   data   

Description

输入一个正整数n,输出n!的值。

其中n!=1*2*3*…*n。

Input

输入包含一个正整数n,n≤1000。

Output

输出n!的准确值。

Sample Input

10

Sample Output

3628800

More Info

n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。

使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。

将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

 

 

 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     int n;
 5     cin>>n;//n的阶乘 
 6     string a="1";//盛放最终答案 
 7     int k=0,t=0; 
 8     int c[3000];
 9     for(int i=2;i<=n;i++){//从小到大乘(从大到小也一样) 
10         k=0;
11         t=0;
12         for(int j=a.size()-1;j>=0;j--){//一位一位的加 
13             t+=(a[j]-0)*i;//算出i和字符串的j位上的乘积 
14             c[k++]=t%10+0;//乘积的个位存到c数组 
15             t=t/10;//乘积除以10后就是进位
16                    //这里进位大于10也没关系,累积到下边处理 
17         }
18         while(t!=0){//只要进位不等于0, 
19             c[k++]=t%10+0;//取个位存进c数组 
20             t/=10;//进位除以10 
21         }
22         a.clear();//清空字符串a 
23         for(int m=k-1;m>=0;m--)//将c数组倒着存入a 
24             a+=c[m];
25     } 
26     cout<<a; 
27     return 0;
28 }

 

主要思想就是用数组模拟竖式运算,这里两个乘数只有一个是用数组存的,

假如算10的阶乘,先用数组存1,然后乘2,这个2不是用数组存的

乘2的结果再用数组存,再乘3,3也不是用数组存的,以此类推

在乘的过程中肯定会出现进位,进位可能是两位数,也可能是多位数

比如15*8得120,0先存进数组里,然后进12,

进位是多位数也不要紧,就先累积着

1         while(t!=0){//只要进位不等于0, 
2             c[k++]=t%10+0;//取个位存进c数组 
3             t/=10;//进位除以10 
4         }

 

这个代码会处理进位,只要进位不等于0,就会一直存进数组

 

 


 

 

 

阶乘计算

标签:col   --   problem   while   高精度计算   hellip   精度   ++   data   

原文地址:https://www.cnblogs.com/fate-/p/12268496.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!