加
给定两个正整数,计算它们的和。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
1≤整数长度≤100000
模板:
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,LL>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100100;
const int M=50100;
const LL mod=10007;
vector<int>A,B;
int len,C[N];
void add(vector<int> &A,vector<int> &B){
for(int i=0;i<A.size()||i<B.size();i++){
if(i<A.size()) C[i]+=A[i];
if(i<B.size()) C[i]+=B[i];
}
len=max(A.size(),B.size());
for(int i=0;i<=len;i++) C[i+1]+=C[i]/10,C[i]%=10;
while(len>0&&C[len]==0) len--;
return;
}
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');
add(A,B);
for(int i=len;i>=0;i--) printf("%d",C[i]);
return 0;
}
减
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105
这个相比于加法,多了个判断,要保证A-B(A>=B);
模板:
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,LL>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100100;
const int M=50100;
const LL mod=10007;
vector<int>A,B;
int len,C[N];
bool judge(vector<int> &A,vector<int> &B){
if(A.size()!=B.size()) return A.size()>B.size();
for(int i=A.size()-1;i>=0;i--){
if(A[i]!=B[i]) return A[i]>B[i];
}
return true;
}
void sub(vector<int> &A,vector<int> &B){//A-B
for(int i=0;i<A.size();i++){
C[i]=A[i];
if(i<B.size()) C[i]-=B[i];
}
len=A.size();
for(int i=0;i<=len;i++){
if(C[i]<0) C[i+1]-=1,C[i]+=10;
}
while(len>0&&C[len]==0) len--;
return;
}
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');
if(judge(A,B)){//A大
sub(A,B);
for(int i=len;i>=0;i--) printf("%d",C[i]);
}
else{//B大
sub(B,A);
printf("-");
for(int i=len;i>=0;i--) printf("%d",C[i]);
}
return 0;
}
乘
题目描述
求两数的积。
输入格式
两行,两个整数。
输出格式
一行一个整数表示乘积。
说明/提示
每个数字不超过 10^2000,需用高精。
模板:
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,LL>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100100;
const int M=50100;
const LL mod=10007;
vector<int>A,B;
int len,C[N];
void mul(vector<int> &A,vector<int> &B){
for(int i=0;i<A.size();i++){
for(int j=0;j<B.size();j++) C[i+j]+=A[i]*B[j];
}
len=A.size()+B.size();
for(int i=0;i<=len;i++) C[i+1]+=C[i]/10,C[i]%=10;
while(len>0&&C[len]==0) len--;
return;
}
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');
mul(A,B);
for(int i=len;i>=0;i--) printf("%d",C[i]);
return 0;
}
除
题目描述
输入两个整数 a,b输出它们的商。
输入格式
两行,第一行是被除数,第二行是除数。
输出格式
一行,商的整数部分。
说明/提示
0≤a≤10^5000,1≤b≤10 ^9
这里的除数范围只有1到1e9,所以这里的除法运算特别简单,但是如果除数范围变的跟被除数一样,就非常困难了;
这个跟上面三种都不太一样,存数由大到小存,然后会有前导0,要排除掉;
模板:
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,LL>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100100;
const int M=50100;
const LL mod=10007;
vector<int>A;
int len,C[N];
void div(vector<int> &A,int b){
int t=0;
for(int i=0;i<A.size();i++){
t=t*10+A[i];
C[i]=t/b;
t%=b;
}
}
int main(){
string a;
int b;
cin>>a;
cin>>b;
for(int i=0;i<a.size();i++) A.push_back(a[i]-'0');
div(A,b);
int ok=0;
for(int i=0;i<A.size();i++){
if(C[i]==0&&ok) printf("%d",C[i]);
else if(C[i]) printf("%d",C[i]),ok=1;
}
return 0;
}