1. 高精度乘法
【题目描述】
输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。
【输入】
输入两个高精度正整数M和N。
【输出】
求这两个高精度数的积。
【输入样例】
36
3
【输出样例】
108
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
char m[110],n[110];
int a[1000],b[1000],c[1000];
int main()
{
cin>>m;
cin>>n;
int alen=strlen(m);
int blen=strlen(n);
int clen=0;
for(int i=0;i<alen;i++)
{
a[alen-i]=m[i]-'0';
}
for(int i=0;i<blen;i++)
{
b[blen-i]=n[i]-'0';
}
for(int i=1;i<=alen;i++)
{
for(int j=1;j<=blen;j++)
{
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
clen=alen+blen;
while(c[clen]==0 && clen>1)
{
clen--;
}
for(int i=clen;i>=1;i--)
{
cout<<c[i];
}
return 0;
}
2.大整数加法
【题目描述】
求两个不超过200位的非负整数的和。
【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
【输入样例】
22222222222222222222
33333333333333333333
【输出样例】
55555555555555555555
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
char arrstring[205],brrstring[205];
int qW(int a,int b)
{
if(a>=b)
{
return a;
}
else
{
return b;
}
}
int main()
{
int len=0;
cin>>arrstring;
cin>>brrstring;
len = qW(strlen(arrstring),strlen(brrstring));
int arrint[205]={0};
int brrint[205]={0};
int crrint[205]={0};
int alen=strlen(arrstring);
int blen=strlen(brrstring);
for(int i=0;i<alen;i++)
{
arrint [alen-i]=arrstring[i]-'0';
}
for(int i=0;i<blen;i++)
{
brrint [blen-i]=brrstring[i]-'0';
}
for(int i=1;i<=len;i++)
{
crrint[i]+=arrint[i]+brrint[i];
crrint[i+1]=crrint[i]/10;
crrint[i]=crrint[i]%10;
}
while(crrint[len+1]==0 && len>0)
{
len--;
}
for(int i=len+1;i>0;i--)
{
cout<<crrint[i];
}
return 0;
}
3.大整数减法
【题目描述】
求两个大的正整数相减的差。
【输入】
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
【输出】
一行,即所求的差。
【输入样例】
9999999999999999999999999999999999999
9999999999999
【输出样例】
9999999999999999999999990000000000000
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
char astring[200],bstring[200];
int main()
{
cin>>astring>>bstring;
int aint[200]={0};
int bint[200]={0};
int cint[200]={0};
int alen=strlen(astring);
int blen=strlen(bstring);
for(int i=0;i<alen;i++)
{
aint[alen-i]=astring[i]-'0';
}
for(int i=0;i<blen;i++)
{
bint[blen-i]=bstring[i]-'0';
}
for(int i=1;i<=alen;i++)
{
if(aint[i]<bint[i])
{
aint[i+1]--;
aint[i]+=10;
cint[i]=aint[i]-bint[i];
}
else
{
cint[i]=aint[i]-bint[i];
}
}
while(cint[alen+1]==0)
{
alen--;
}
for(int i=alen+1;i>0;i--)
{
cout<<cint[i];
}
return 0;
}
4.高精除
【题目描述】
高精除以高精,求它们的商和余数。
【输入】
输入两个低于300位的正整数。
【输出】
输出商和余数。
【输入样例】
1231312318457577687897987642324567864324567876543245671425346756786867867867
1231312318767141738178325678412414124141425346756786867867867
【输出样例】
999999999748590
179780909068307566598992807564736854549985603543237528310337
#include<bits/stdc++.h>
using namespace std;
char achar[305],bchar[305];
int alen,blen;
int aint[305];
int bint[305];
int cint[305];
bool cmp(int x)
{
if(aint[x+blen]>0)
{
return true;
}
for(int i=blen;i>=1;i--)
{
if (aint[x+i-1]<bint[i])
{
return false;
}
else if (aint[x+i-1]>bint[i])
{
return true;
}
}
return true;
}
int main()
{
cin>>achar>>bchar;
alen=strlen(achar);
blen=strlen(bchar);
for (int i=0;i<alen;i++)
{
aint[alen-i]=achar[i]-'0';
}
for (int i=0;i<blen;i++)
{
bint[blen-i]=bchar[i]-'0';
}
for(int i=alen-blen+1;i>=1;i--)
{
while(cmp(i))
{
cint[i]++;
for(int j=1;j<=blen;j++)
{
if (aint[i+j-1]>=bint[j])
{
aint[i+j-1]-=bint[j];
}
else
{
aint[i+j]--;
aint[i+j-1]+=10-bint[j];
}
}
}
}
bool flag=1;
bool y=0;
for (int i=alen;i>=1;i--)
{
if (flag==0||cint[i]>0)
{
cout<<cint[i];
flag=0;
y=1;
}
}
if(y==0) cout<<0;
cout<<endl;
flag=1;
y=0;
for (int i=alen;i>=1;i--)
{
if (flag==0||aint[i]>0)
{
cout<<aint[i];
flag=0;
y=1;
}
}
if (y==0) cout<<0;
return 0;
}