大数类的运算 其实就模拟我们小学学的加减乘除
分析:我们都把字符串转化成int 数组比较好做
1. 加法
【题目描述】求两个不超过200位的非负整数的和。 【输入】有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。 【输出】一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。 【输入样例】22222222222222222222 33333333333333333333 【输出样例】55555555555555555555 |
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int cnt=0;
for(int i=0;i<a.length();i++){
if(a[i]=='0') cnt++;
else break;
}
a=a.substr(cnt);
cnt=0;
for(int i=0;i<b.length();i++){
if(b[i]=='0') cnt++;
else break;
}
b=b.substr(cnt);
int len1=a.length();
int len2=b.length();
if(len2>len1) swap(a,b),swap(len1,len2);
string s;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int t=0;
for(int i=0;i<len1;i++){
int x=0;
if(i<len2) x+=b[i]-'0';
x+=a[i]-'0'+t;
t=(x/10);
x=x%10;
s.push_back(x+'0');
}
if(t!=0) s.push_back(t);
reverse(s.begin(),s.end());
cout<<s<<endl;
return 0;
}
2.大数减法
【题目描述】求两个大的正整数相减的差。 【输入】共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。 【输出】一行,即所求的差。 【输入样例】9999999999999999999999999999999999999 9999999999999 【输出样例】9999999999999999999999990000000000000 |
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int len1=a.length(),len2=b.length();
vector<int>v1(len1),v2(len1);
for(int i=0;i<len1;i++) v1[i]=a[i]-'0';
for(int i=0;i<len2;i++) v2[i]=b[i]-'0';
vector<int>vec;
for(int i=0;i<len1||i<len2;i++){
if(v1[i]<v2[i]){
v1[i]+=10;
v1[i+1]--;
}
vec.push_back(v1[i]-v2[i]);
}
int cnt=vec.size()-1;
//去除高位的0 同时至少保留一位最低位
while(cnt>=1&&vec[cnt]==0) cnt--;
for(int i=cnt;i>=0;i--){
cout<<vec[i];
}
cout<<endl;
return 0;
}
3.大数乘法
【题目描述】输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】输入两个高精度正整数M和N。 【输出】求这两个高精度数的积。 【输入样例】36 3 【输出样例】108 |
#include<bits/stdc++.h>
#define MAX 105
char a[MAX],b[MAX];
int x[MAX+10],y[MAX+10],z[MAX*2+10];
int main()
{
int len1,len2,i,j;
while(~scanf("%s %s",a,b))
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z));
len1=strlen(a);
len2=strlen(b);
for(j=0,i=len1-1;i>=0;i--)
x[j++]=a[i]-'0';
for(j=0,i=len2-1;i>=0;i--)
y[j++]=b[i]-'0';
for(i=0;i<len1;i++)
{
for(j=0;j<len2;j++)
z[i+j]=z[i+j]+x[i]*y[j];
}
for(i=0;i<MAX*2;i++)
{
if(z[i]>=10)
{
z[i+1]=z[i+1]+z[i]/10;
z[i]=z[i]%10;
}
}
for(i=MAX*2;i>0;i--)
{
if(z[i]==0)
continue;
else
break;
}
for(;i>=0;i--)
printf("%d",z[i]);
printf("\n");
}
return 0;
}
4 高精度与低精度的除法
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int x;
cin>>x;
vector<int>vec;
for(int i=0;i<s.length();i++){
vec.push_back(s[i]-'0');
}
int r=0;//余数
vector<int>vv;
for(int i=0;i<vec.size();i++){
r=r*10+vec[i];
if(r<x){
vv.push_back(0);
}
else{
vv.push_back(r/x);
r=r%x;
}
}
int cnt=0;
//去除高位0 同时至少保留一位最低位
while(cnt<vv.size()-1&&vv[cnt]==0) cnt++;
for(int i=cnt;i<vv.size();i++){
cout<<vv[i];
}
cout<<endl;
return 0;
}