经典例题——高精度(大整数)运算

大整数运算

1. 蓝桥杯—大整数阶乘

问题描述
  输入一个正整数n,输出n!的值。
  其中n!=1 * 2 * 3…n

解决思路:
n!非常大,可以使用数组存储各位,a[0]表示最低位,初始化为1,然后循环,每一位都乘以2、3、……n,根据各位大小判断是否向前进位,最后逆序输出各位即可

#include
#include
using namespace std;

int main(){
    int num;
    cin>>num;      //阶乘数
    vector<int> a;   //容器存放各位
    a.push_back(1);
    
    for(int i=2;i<=num;i++){         //乘数依次递增
            
        for(int j=0;j<a.size();j++){   //每一位乘乘数
            a[j]*=i;
        }
    
        for(int k=0;k<a.size();k++){   //从第一位开始判断
            if(a[k]<10) continue;      //数字<10,不进位不变化,继续
            if(a[k]>=10){
                int jinwei=a[k]/10;    //数字>=10,算出进位数和余数
                a[k]%=10;
                if(k==a.size()-1)      
                    a.push_back(jinwei);   //现在是最后一位,则把进位加到容器
                else
                    a[k+1]+=jinwei;        //不是最后一位,则下一位=进位+基数
            }
        }
    }
    
    for(int i=a.size()-1;i>=0;i--){        //逆序输出
        cout<<a[i];
    }
    
    return 0;
}
输入:10
输出;3628800

2. 大整数加法

输入两个大整数,输出其结果

解决方案:
按字符串读入两个大整数,将其反转并存入初始化为0的int数组,根据最长的数字,遍历两数组求和,反序输出即可

#include
using namespace std;

int main(){

    string str1,str2;
    cin>>str1>>str2;                //读入两个串表示大整数
    int len1=str1.size(),len2=str2.size();     //求串长并找出较长串长度
    int maxlen=max(len1,len2);
    int num1[1000]={0},num2[1000]={0};         //数组初始化为0存储两大整数

    for(int i=0;i<len1;i++){
        num1[i]=str1[len1-i-1]-'0';            //将两大整数反序录入int数组
    }
    for(int i=0;i<len2;i++){
        num2[i]=str2[len2-i-1]-'0';
    }

    for(int i=0;i<maxlen;i++){             //求出和并将各位重新存储到num1[]中
        int sum=num1[i]+num2[i];
        int jinwei=sum/10;
        num1[i+1]+=jinwei;
        num1[i]=sum%10;
    }

    if(num1[maxlen]!=0) maxlen++;         //如果最后一位存在进位,则长度加一
    for(int i=maxlen-1;i>=0;i--){         
        cout<<num1[i];                    //逆序输出
    }

    return 0;
}

你可能感兴趣的:(经典例题——高精度(大整数)运算)