大整数运算
1. 蓝桥杯—大整数阶乘
问题描述
输入一个正整数n,输出n!的值。
其中n!=1 * 2 * 3…n
解决思路:
n!非常大,可以使用数组存储各位,a[0]表示最低位,初始化为1,然后循环,每一位都乘以2、3、……n,根据各位大小判断是否向前进位,最后逆序输出各位即可
#include<iostream>
#include<vector>
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<iostream>
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;
}