高精度
高精度加法
题目描述
高精度加法,相当于a+b problem,不用考虑负数.
输入格式
分两行输入。\(a,b \leq 10^{500}\)
输出格式
输出只有一行,代表\(a+b\)的值
输入 #1
1
1
输出 #1
2
输入 #2
1001
9099
输出 #2
10100
题目链接
P1601
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//C=A+B,A>=0,B>=0
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;
}
vector<int> A,B,C;
string a,b;
int main()
{
cin>>a>>b;
for(int i=a.size()-1;~i;i--)
A.push_back(a[i]-'0');
for(int i=b.size()-1;~i;i--)
B.push_back(b[i]-'0');
C=add(A,B);
for(int i=C.size()-1;~i;i--)
printf("%d",C[i]);
return 0;
}
高精度减法
题目描述
高精度减法。
输入格式
两个整数 \(a,b\)(第二个可能比第一个大)。
输出格式
结果(是负数要输出负号)。
输入 #1
2
1
输出 #1
1
说明/提示
- \(20\%\) 数据 \(a,b\) 在 long long 范围内;
- \(100\%\) 数据 \(0<a,b\le 10^{10086}%\)。
题目链接
P2142
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//C=A-B,满足A>=B,A>=0,B>=0
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);
t=t<0?1:0;
}
while(C.size()>1&&C.back()==0)C.pop_back();
return C;
}
vector<int> A,B,C;
string a,b;
int main()
{
cin>>a>>b;
if(a.size()<b.size()||(a.size()==b.size()&&a<b))putchar('-'),swap(a,b);
for(int i=a.size()-1;~i;i--)
A.push_back(a[i]-'0');
for(int i=b.size()-1;~i;i--)
B.push_back(b[i]-'0');
C=sub(A,B);
for(int i=C.size()-1;~i;i--)
printf("%d",C[i]);
return 0;
}
高精度乘法
高精度\(\times\)低精度
题目描述
给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。
输入格式
共两行,第一行包含整数 A,第二行包含整数 B。
输出格式
共一行,包含 A×B 的值。
数据范围
\(1≤A的长度≤100000\),
\(0≤B≤10000\)
输入样例:
2
3
输出样例:
6
题目链接
acwing793. 高精度乘法
代码
//高精度*低精度
#include<bits/stdc++.h>
using namespace std;
//C=A*b
vector<int> mul(vector<int> A,int b)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size()||t;i++)
{
if(i<A.size())t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0)C.pop_back();
return C;
}
int main()
{
vector<int> A;
string a;
int b;
cin>>a>>b;
for(int i=a.size()-1;~i;i--)A.push_back(a[i]-'0');
vector<int> C=mul(A,b);
for(int i=C.size()-1;~i;i--)cout<<C[i];
return 0;
}
高精度\(\times\)高精度
题目描述
求两数的积。
输入格式
两行,两个整数。
输出格式
一行一个整数表示乘积。
输入
1
2
输出
2
说明/提示
每个数字不超过 \(10^{2000}\) ,需用高精。
题目链接
P1303 A*B Problem
代码
//高精度*高精度
#include<bits/stdc++.h>
using namespace std;
//C=A*B
vector<int>mul(vector<int> A,vector<int> B)
{
vector<int> C(A.size()+B.size()+1);
for(int i=0;i<A.size();i++)
for(int j=0;j<B.size();j++)
{
C[i+j]+=A[i]*B[j];
C[i+j+1]+=C[i+j]/10;
C[i+j]%=10;
}
while(C.size()>1&&C.back()==0)C.pop_back();
return C;
}
int main()
{
vector<int> A,B,C;
string a,b;
cin>>a>>b;
for(int i=a.size()-1;~i;i--)A.push_back(a[i]-'0');
for(int i=b.size()-1;~i;i--)B.push_back(b[i]-'0');
C=mul(A,B);
for(int i=C.size()-1;~i;i--)cout<<C[i];
return 0;
}
高精度\(\div\)低精度
题目描述
输入两个整数 \(a,b\),输出它们的商。
输入格式
两行,第一行是被除数,第二行是除数。
输出格式
一行,商的整数部分。
输入
10
2
输出
5
说明/提示
\(0≤a≤10^{5000} ,1\le b\le 10^9\)。
题目链接
代码
//高精度/低精度
#include<bits/stdc++.h>
using namespace std;
//A/b=C……r,A>=0,b>0
vector<int> div(vector<int> A,int b,long long &r)
{
vector<int> C;
r=0;
for(int i=A.size()-1;~i;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()
{
vector<int> A,C;
string a;
int b;
long long r;
cin>>a>>b;
for(int i=a.size()-1;~i;i--)A.push_back(a[i]-'0');
C=div(A,b,r);
for(int i=C.size()-1;~i;i--)cout<<C[i];//商
putchar('\n');
//cout<<r;//余数
return 0;
}