主函数:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
string a,b;
vector<int>A,B,C;//C用来运算
int c;
int r;//除法的余数
int main(int argc, const char * argv[])
{
cin>>a;
cin>>b;
cin>>c;
getA_B(a,b);//将a,b以数组形式储存
add_A_B(A,B);
sub_A_B(A,B);
mul_A_c(A,c);
div_A_c(A,c,r);
return 0;
}
数字录入:以字符型写入(vector储存):
void getA_B(string a,string b)
{
if(a[0]=='-' || b[0]=='-')//判断负数
{
if(a[0]=='-')
for(int i=(int)a.size()-1;i>0;i--)A.push_back(a[i]-'0');//逆序储存
if(b[0]=='-')
for(int i=(int)b.size()-1;i>0;i--)B.push_back(b[i]-'0');
}
else
{
for(int i=(int)a.size()-1;i>=0;i--)A.push_back(a[i]-'0');//逆序储存
for(int i=(int)b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
}
}
高精度(加法&减法):
加法和减法互通,所以一并给出
注意:减法时要判断A,B,大小(bool cmp判断)
bool cmp(vector<int> &A,vector<int> &B)//判断A,B大小
{
if(A.size()!=B.size())return A.size()>B.size();
for(int i=(int)A.size()-1;i>=0;i--)
{
if(A[i]!=B[i])
return A[i]>B[i];
}
return true;
}
vector<int> sub(vector<int> &A,vector<int> &B)//高精度减法
{
vector<int>D;
int t=0;
if(cmp(A,B))//判断A,B谁大
{
for(int i=0;i<A.size();i++)
{
t=A[i]-t;
if(i<B.size())t-=B[i];
D.push_back((t+10)%10);
if(t<0)t=1;
else t=0;
}
}
else
{
for(int i=0;i<B.size();i++)
{
t=B[i]-t;
if(i<A.size())t-=A[i];
D.push_back((t+10)%10);
if(t<0)t=1;
else t=0;
}
}
while (D.size()>1 && D.back()==0)D.pop_back();//去掉前导0
return D;
}
void sub_A_B(vector<int> &A,vector<int> &B)
{
//A-B
printf("差:");
if(a[0]!='-' && b[0]!='-')
{
C=sub(A,B);//单纯A-B
if(!cmp(A,B))
printf("-");
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
if(a[0]=='-' && b[0]=='-')
{
C=sub(A,B);//等同于B-A
if(cmp(A,B))
printf("-");
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
if(a[0]!='-' && b[0]=='-')
{
C=add(A,B);//A+B
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
if(a[0]=='-' && b[0]!='-')
{
C=add(A,B);//-(A+B)
printf("-");
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
printf("\n");
}
vector<int> add(vector<int> &A,vector<int> &B)//加上&增加速度,高精度加法
{
vector<int>C;//C=A+B
int t=0;//定义一个进位
for(int i=0;i<A.size() || i<B.size() ;i++)
{
if(i<A.size())t+=A[i];//t+A
if(i<B.size())t+=B[i];//t+B
C.push_back(t%10);
t/=10;//进位
}
if(t)C.push_back(1);//可能存在最高位的进位
return C;
}
void add_A_B(vector<int> &A,vector<int> &B)
{
//A+B
printf("和:");
if(a[0]!='-' && b[0]!='-')
{
C=add(A,B);
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
if(a[0]=='-' && b[0]=='-')
{
C=add(A,B);
printf("-");
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
if(a[0]!='-' && b[0]=='-')
{
C=sub(A,B);
if(!cmp(A,B))
printf("-");
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
if(a[0]=='-' && b[0]!='-')
{
C=sub(A,B);
if(cmp(A,B))
printf("-");
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
printf("\n");
}
高精度乘法:
vector<int> mul(vector<int> &A,int &b)//高精度乘法
{
if(b<0)
b=-b;
vector<int>C;//C=A*b
int t=0;//定义一个进位
for(int i=0;i<A.size() || t;i++)
{
if(i<A.size())t+=A[i]*b;//t+A
C.push_back(t%10);
t/=10;//进位
}
if(t)C.push_back(1);//可能存在最高位的进位
return C;
}
void mul_A_c(vector<int> &A,int &c)
{
printf("积:");
C=mul(A,c);//A*c
if((a[0]!='-' && c>=0)||(c<0 && a[0]=='-'))
{
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
if((a[0]=='-' && c>0)||(c<0 && a[0]!='-'))
{
printf("-");
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
printf("\n");
}
高精度除法:
vector<int> div(vector<int> &A,int &b,int &r)//高精度除法,r为余数
{
if(b<0)
b=-b;
vector<int>C;//C=A*b
for(int i=(int)A.size()-1;i>=0;i--)
{
r=r*10+A[i];
C.push_back(r/b);
r=r%b;
}
reverse(C.begin(),C.end());//将数列里的数反向排序
while (C.size()>1 && C.back()==0)C.pop_back();//清除前导0
return C;
}
void div_A_c(vector<int> &A,int &c,int r)
{
printf("商:");
C=div(A,c,r);//A/c......r
if((a[0]!='-' && c>=0)||(c<0 && a[0]=='-'))
{
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
if((a[0]=='-' && c>0)||(c<0 && a[0]!='-'))
{
printf("-");
for(int i=(int)C.size()-1;i>=0;i--)printf("%d",C[i]);
}
printf("余:%d",r);
printf("\n");
}