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,就会一直存进数组
标签:10,计算,int,数组,阶乘,t%,进位 来源: https://www.cnblogs.com/fate-/p/12268496.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。