简单计算(第一个数大于第二个数的高精度加减法)
题目描述
计算机的基本功能是计算,作为一个计算机爱好者,Ivy当然知道如何编写一个计算机程序,让计算机能进行简单的计算。
之所以简单,因为Ivy的程序只需根据输入的两个正整数,根据要求计算这两个数的和或者差即可(所有输入数据确保x>=y)。
输入
输入共有三行。第一行包含一个正整数x,第二行包含一个正整数y,第三行包含一个算术运算符(加号或者减号)。
输出
只有一行,表示将输入的两个正整数根据运算符进行计算后所得结果(两数之和或者之差)。
样例输入 Copy
251
249
+
样例输出 Copy
500
提示
对于60%的数据,1<=x,y<=16383;
对于80%的数据,1<=x,y<=1073741823;
对于90%的数据,1<=x,y<=4*1019
对于100%的数据,1<=x,y<=1030。
该板子纯属为日后方便记忆所创
温馨提示:该代码后方有专业板子
#include<bits/stdc++.h>
using namespace std;
int st[4000];
int main()
{
char c;
string a,b;
int len1,len2,i,j,s=0;
cin>>a>>b>>c;
memset(st,0,sizeof(st));
len1=a.size();
len2=b.size();
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
if(c=='+')
{
for(i=0,j=0;i<len1&&j<len2;i++,j++)
{
st[s]+=a[i]+b[j]-96;
if(st[s]>=10)
{
st[s]-=10;
st[s+1]++;
}
// cout<<st[s]<<endl;
s++;
//cout<<st[s]<<endl;
}
while(i<len1)
{
st[s]+=a[i]-48;
//cout<<st[s]<<endl;
if(st[s]>=10)
{
st[s]-=10;
st[s+1]++;
}
s++;
i++;
}
while(j<len2)
{
st[s]+=b[j]-48;
if(st[s]>=10)
{
st[s]-=10;
st[s+1]++;
}
s++;
j++;
}
}
else if(c=='-')
{
if(a==b){
cout<<0<<endl;
return 0;
}
else
{
for(i=0,j=0;i<len1&&j<len2;i++,j++)
{
st[s]+=a[i]-b[j];
if(st[s]<0)
{
st[s]+=10;
st[s+1]--;
}
s++;
}
while(i<len1)
{
st[s]+=a[i]-48;
if(st[s]<0)
{
st[s]+=10;
st[s+1]--;
}
s++;
i++;
}
while(j<len2)
{
st[s]+=b[j]-48;
if(st[s]<0)
{
st[s]+=10;
st[s+1]--;
}
s++;
j++;
}
}
}
//cout<<s<<endl;
int flag1=0;
for(i=s;i>=0;i--)
{
if(st[i]==0&&flag1==0) continue;
else{
flag1=1;
cout<<st[i];
}
}
return 0;
}
以上为博主本人自己琢磨所写的代码,太乱了,不忍直视2333333,嫌弃。。。。
----------------------------------------------------------分割线----------------------------------------------------------------------
膜拜y总 Orz
以下皆为模仿y总的模板
高精度加法模板
题目传送门
题目描述
给定两个正整数,计算它们的和。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
1≤整数长度≤100000
输入样例:
12
23
输出样例:
35
上代码:
#include<iostream>
#include<vector>
using namespace std;
vector<int> A,B;
vector<int> add(vector<int> &A,vector<int> &B)
{
vector<int> c;
if(A.size()<B.size()) return add(B,A);
int t=0;
for(int i=0;i<A.size();i++)
{
t+=A[i];
if(i<B.size())
t+=B[i];
c.push_back(t%10);
t/=10;
}
if(t) c.push_back(t);
return c;
}
int main()
{
string a,b;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
auto ans=add(A,B);
for(int i=ans.size()-1;i>=0;i--)
{
cout<<ans[i];
}
return 0;
}
Leetcode上找到一个比较简洁的代码,搬来记录一下
class Solution {
public:
string addStrings(string num1, string num2) {
string ans;
int t = 0,i = num1.size() - 1,j = num2.size() - 1;
while(i >=0 || j >= 0 || t != 0)
{
if(i >= 0) t += num1[i --] - '0';
if(j >= 0) t += num2[j --] - '0';
ans += (t % 10) + '0';
t /= 10;
}
reverse(ans.begin(),ans.end());
return ans;
}
};
高精度减法模板(第一个数小于第二个数同样适用)
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
上代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
bool cmp(vector<int> A,vector<int> B)
{
if(A.size()!=B.size()) return A.size()>B.size();
else
{
for(int i=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> C;
for(int i=0,t=0;i < A.size();i++)
{
t=A[i]-t;
if(i < B.size()) t-=B[i];
C.push_back((t+10)%10);
if(t<0) t=1;
else t=0;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a,b;
vector<int> A,B,ans;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
if(cmp(A,B))
{
ans=sub(A,B);
for(int i=ans.size()-1;i>=0;i--)
{
cout<<ans[i];
}
}
else{
cout<<"-";
ans=sub(B,A);
for(int i=ans.size()-1;i>=0;i--)
{
cout<<ans[i];
}
}
return 0;
}
高精度乘法(高精度乘以低精度)
上代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<int> mult(vector<int> &A , int b)
{
vector<int> c;
int t=0;
for(int i=0;i < A.size() || t!=0;i++)
{
if(i < A.size() ) t+=A[i]*b;
c.push_back(t%10);
t/=10;
}
return c;
}
int main()
{
string a;
vector<int> A;
int b;
cin>>a>>b;
if(b==0) cout<<0<<endl;
else{
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
auto ans=mult(A,b);
for(int i=ans.size()-1;i>=0;i--)
{
cout<<ans[i];
}
}
return 0;
}
高精度除法(高精度除于低精度,得到商和余数)
上代码:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> A;
vector<int> div(vector<int> &A,int b,int &r)
{
vector<int> c;
r=0;
for(int i=A.size()-1;i>=0;i--)
{
r = r * 10 + A[i];
c.push_back(r/b);
r %= b;
}
reverse(c.begin(),c.end());
while(c.size()>1&&c.back()==0) c.pop_back();
return c;
}
int main()
{
string a;
int b;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
int r;
auto ans=div(A,b,r);
for(int i=ans.size()-1;i>=0;i--)
cout<<ans[i];
cout<<endl<<r<<endl;
return 0;
}
之后如若遇到高精度乘以高精度或是高精度除以高精度,再回来补一下
----------------------------------------------------------待续-------------------------------------------------------------------------