常考题型 大整数运算
最近刷题发现机试很喜欢考大整数运算,于是我自己写了几个大整数运算的函数。
可能写的不是很好,主要帮助自己理解原理。
代码:
#include <iostream>
#include <vector>
using namespace std;
vector<int> ToBigInt(string str){
//将字符转换串转换成int向量
vector<int> num;
for(int i=0;i<str.size();i++)
num.push_back(str[i]-'0');
return num;
}
int compare(vector<int> num1,vector<int> num2){
//比较大小,小于输出1,大于输出-1,等于输出0
if(num1.size()<num2.size()) return 1;
else if(num1.size()>num2.size()) return -1;
else{
for(int i=0;i<num1.size();i++){
if(num1[i]<num2[i]) return 1;
else if(num1[i]>num2[i]) return -1;
}
return 0;
}
}
vector<int> Add(vector<int> num1,vector<int> num2){
//加法运算
//补零使得两数对齐
if(num1.size()>num2.size())
num2.insert(num2.begin(),num1.size()-num2.size(),0);
else if(num1.size()<num2.size())
num1.insert(num1.begin(),num2.size()-num1.size(),0);
vector<int> num3;
int ci=0;//进位
for(int i=num1.size()-1;i>=0;i--){
num3.insert(num3.begin(),(num1[i]+num2[i]+ci)%10);
ci=(num1[i]+num2[i]+ci)/10;
}
if(ci!=0) num3.insert(num3.begin(),ci);//如果还有进位,插入结果头部
return num3;
}
vector<int> Sub(vector<int> num1,vector<int> num2){
//减法运算
int sign=0;//标记结果符号
if(compare(num1,num2)==1){//num1<num2则交换两数,同时标记结果为负
swap(num1,num2);
sign=1;
}
//补零使两数对齐
if(num1.size()>num2.size())
num2.insert(num2.begin(),num1.size()-num2.size(),0);
else if(num1.size()<num2.size())
num1.insert(num1.begin(),num2.size()-num1.size(),0);
vector<int> num3;
int carry=0;//借位
for(int i=num1.size()-1;i>=0;i--){
num3.insert(num3.begin(),(num1[i]+10-num2[i]-carry)%10);
if(num1[i]-num2[i]-carry<0) carry=1;
else carry=0;
}
//去掉前缀0
int pos=0;
while(num3[pos]==0)
pos++;
num3.erase(num3.begin(),num3.begin()+pos);
//如果是负数加上负号
if(sign==1) num3[0]=-num3[0];
return num3;
}
vector<int> Mul(vector<int> num1,vector<int> num2){
//乘法运算
vector<int> num3(num1.size()+num2.size(),0);
for(int i=num1.size()-1;i>=0;i--)//记录每位结果
for(int j=num2.size()-1;j>=0;j--)
num3[num3.size()-1-(num1.size()-1-i+num2.size()-1-j)]+=num1[i]*num2[j];
for(int i=num3.size()-1;i>0;i--){//修改进位
if(num3[i]>=10){
num3[i-1]+=num3[i]/10;
num3[i]=num3[i]%10;
}
}
//去掉前缀0
int pos=0;
while(num3[pos]==0)
pos++;
num3.erase(num3.begin(),num3.begin()+pos);
if(num3.size()==0) num3.push_back(0);
return num3;
}
vector<int> Div(vector<int> num1,int num2,int &r){
//除法运算,r表示余数,引用返回
if((num1.size()==1 && num1[0]==0)){
vector<int> zero;
zero.push_back(0);
return zero;
}
vector<int> num3;
for(int i=0;i<num1.size();i++){
r=r*10+num1[i];
num3.push_back(r/num2);
r=r%num2;
}
//去掉前缀0
int pos=0;
while(num3[pos]==0)
pos++;
num3.erase(num3.begin(),num3.begin()+pos);
if(num3.size()==0) num3.push_back(0);
return num3;
}
int main() {
cout<<"输入两个大整数:";
string str1, str2;
cin >> str1 >> str2;
vector<int> num1= ToBigInt(str1),num2= ToBigInt(str2);
int CompareRes= compare(num1,num2);
if(CompareRes==1) cout<<"num1<num2";
else if(CompareRes==0) cout<<"num1=num2";
else cout<<"num1>num2";
cout<<endl;
vector<int> AddRes= Add(num1,num2);
cout<<"num1+num2=";
for(int i=0;i<AddRes.size();i++) cout<<AddRes[i];
cout<<endl;
vector<int> SubRes= Sub(num1,num2);
cout<<"num1-num2=";
for(int i=0;i<SubRes.size();i++) cout<<SubRes[i];
cout<<endl;
vector<int> MulRes= Mul(num1,num2);
cout<<"num1*num2=";
for(int i=0;i<MulRes.size();i++) cout<<MulRes[i];
cout<<endl;
cout<<endl;
cout<<"输入一个大整数被除数和一个小整数除数:";
string str;
cin>>str;
getchar();
int x;
cin>>x;
int r=0;
vector<int> num= ToBigInt(str);
vector<int> DivRes=Div(num,x,r);
cout<<"num1/num2=";
for(int i=0;i<DivRes.size();i++)
cout<<DivRes[i];
cout<<endl;
cout<<"余数r="<<r<<endl;
}
运行结果:
查看9道真题和解析