zoukankan      html  css  js  c++  java
  • 阶乘计算

    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,就会一直存进数组

     

     


     

     

     

  • 相关阅读:
    LCM与GCD算法
    LCS,LIS,LICS算法
    高精度算法(C/C++)
    SystemTap
    VMware15下解决Ubuntu18.04没有网络连接问题
    Git ssh-key 配置问题
    Ubuntu18.04更换国内源
    sql 错误日志存储路径设置
    资源
    System.Data.DataTable 基本方法
  • 原文地址:https://www.cnblogs.com/fate-/p/12268496.html
Copyright © 2011-2022 走看看