1、高精加高精
1168:大整数加法
【题目描述】
求两个不超过200位的非负整数的和。
【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
【输入样例】
22222222222222222222
33333333333333333333
【输出样例】
55555555555555555555
<代码>
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int a[N],b[N],c[N],la,lb,lc;
string sa,sb;
void add()
{
for(int i=1;i<=lc;i++)//先加
c[i]=a[i]+b[i];
for(int i=1;i<=lc;i++)//进位
c[i+1]+=c[i]/10,c[i]%=10;
if(c[lc+1])lc++;//高位有进位
while(c[lc]==0&&lc>1)lc--;
}
int main()
{
cin>>sa>>sb;
la=sa.size(),lb=sb.size();
lc=max(la,lb);
for(int i=0;i<la;i++)a[la-i]=sa[i]-'0';//1-la
for(int i=0;i<lb;i++)b[lb-i]=sb[i]-48;//倒序存储
add();
for(int i=lc;i;i--)cout<<c[i];
return 0;
}
2、高精减高精
1169:大整数减法
【题目描述】
求两个大的正整数相减的差。
【输入】
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
【输出】
一行,即所求的差。
【输入样例】
9999999999999999999999999999999999999
9999999999999
【输出样例】
9999999999999999999999990000000000000
<代码>
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],b[N],c[N],la,lb,lc;
string sa,sb;
void jian()
{
for(int i=1;i<=lc;i++)//先减
c[i]=a[i]-b[i];
for(int i=1;i<=lc;i++)//后借
if(c[i]<0)c[i+1]--,c[i]+=10;
while(c[lc]==0&&lc>1)lc--;
}
int main()
{
cin>>sa>>sb;
la=sa.size();lb=sb.size();
lc=max(la,lb);
for(int i=0;i<la;i++)a[la-i]=sa[i]-48;
for(int i=0;i<lb;i++)b[lb-i]=sb[i]-48;
jian();
for(int i=lc;i;i--)cout<<c[i];
return 0;
}
3、高精乘单精
1172:求10000以内n的阶乘
【题目描述】
求10000以内n的阶乘。
【输入】
只有一行输入,整数n(0≤n≤10000)。
【输出】
一行,即n!的值。
【输入样例】
4
【输出样例】
24
<代码>
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],la,n;
void mul(int a[],int b)//高精*单精
{
for(int i=1;i<=la;i++)
a[i]*=b;//先乘
for(int i=1;i<=la;i++)//进位
a[i+1]+=a[i]/10,a[i]%=10;
while(a[la+1]){//高位多次进位
la++;
a[la+1]=a[la]/10;
a[la]%=10;
}
}
int main()
{
cin>>n;
la=1,a[1]=1;//初始化
for(int i=2;i<=n;i++)
mul(a,i);
for(int i=la;i;i--)cout<<a[i];
return 0;
}
4、高精乘高精
1307:【例1.3】高精度乘法
【题目描述】
输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。
【输入】
输入两个高精度正整数M和N。
【输出】
求这两个高精度数的积。
【输入样例】
36
3
【输出样例】
108
<代码>
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],b[N],c[N],la,lb,lc;
string sa,sb;
void mul()//高精*高精
{
for(int i=1;i<=la;i++)//a 先乘
for(int j=1;j<=lb;j++)//b
c[i+j-1]+=a[i]*b[j];
for(int i=1;i<=lc;i++)//进位
c[i+1]+=c[i]/10,c[i]%=10;
while(c[lc]==0&&lc>1)lc--;//前导0
}
int main()
{
cin>>sa>>sb;
la=sa.size();lb=sb.size();
lc=la+lb;
for(int i=0;i<la;i++)a[la-i]=sa[i]-48;
for(int i=0;i<lb;i++)b[lb-i]=sb[i]-48;
mul();
for(int i=lc;i;i--)cout<<c[i];
return 0;
}
5、高精除单精
1175:除以13
【题目描述】
输入一个大于0的大整数N,长度不超过100位,要求输出其除以13得到的商和余数。
【输入】
一个大于0的大整数,长度不超过100位。
【输出】
两行,分别为整数除法得到的商和余数。
【输入样例】
2132104848488485
【输出样例】
164008065268345
0
<代码>
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],b,c[N],la,yu,lc;
string sa;
void div()//高精除以单精
{
for(int i=1;i<=la;i++)
{
yu=yu*10+a[i];
c[i]=yu/13;
yu%=13;
}
while(c[lc]==0&&lc<la)lc++;
}
int main()
{
cin>>sa;
la=sa.size();
for(int i=0;i<la;i++)a[i+1]=sa[i]-48;
div();
for(int i=lc;i<=la;i++)cout<<c[i];
cout<<endl<<yu<<endl;
return 0;
}