标签:col -- problem while 高精度计算 hellip 精度 ++ data
输入一个正整数n,输出n!的值。
其中n!=1*2*3*…*n。
输入包含一个正整数n,n≤1000。
输出n!的准确值。
10
3628800
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