高精度
高精度就是爆int还爆long long的类型。
1456 巨型军团的测试
解题思路:
高精度只能用字符串来进行存储。因为字符串本身没有运算功能,为了方便运算,需要将字符串转换为整数数组。需将数位对齐,将各位数字逆序存放,以第一位为个位,可以进行数位对齐。和竖式计算差不多,按照列竖式计算的过程,进行模拟运算各位求和并且进位,反向逐位输出。最后数位对齐,从个位开始,所以要反向输出。
最强题解:
#include<bits/stdc++.h>//通用
using namespace std;
int a[2005],b[2005],c[2005];//数组范围
int na,nb,nc;//数位长度
char s[2005];
int main()
{
//清空数组
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int ns;
//读入a
scanf("%s",s+1);
ns=strlen(s+1); na=ns;
for(int i=1;i<=ns;i++)
{
a[ns-i+1]=s[i]-'0';
}
//读入b
scanf("%s",s+1);
ns=strlen(s+1); nb=ns;
for(int i=1;i<=ns;i++)
{
b[ns-i+1]=s[i]-'0';
}
//确定数位
nc=max(na,nb);
//进行加法
for(int i=1;i<=nc;i++)
{
c[i]+=a[i]+b[i];
}
//进位
for(int i=1;i<=nc;i++)
{
if(c[i]>9)
{
c[i+1]+=c[i]/10;
c[i]%=10;
if(i==nc) nc++;
}
}
//最高位不能为0
while(c[nc]==0&&nc>1) nc--;
for(int i=nc;i>=1;i--)
{
printf("%d",c[i]);
}
return 0;
}
1457 巨型军团的测试2:合格
解题思路:
同第一题一样。
treeoj题目范围:
求a-b,保证啊a>b。
最强题解:
#include<cstdio>
#include<cstring>
int a[2005],b[2005],c[2005];
int na,nb,nc;
char s[2005];
int main()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%s",s+1);
na=strlen(s+1);
for(int i=1;i<=na;i++)
{
a[na-i+1]=s[i]-'0';
}
scanf("%s",s+1);
nb=strlen(s+1);
for(int i=1;i<=nb;i++)
{
b[nb-i+1]=s[i]-'0';
}
//差的数位
nc=na;
//做减法
for(int i=1;i<=nc;i++)
{
c[i]=a[i]-b[i];
}
//进行借位
for(int i=1;i<=nc;i++)
{
if(c[i]<0)
{
c[i+1]--;//因为是反向,所以是向右借一
c[i]+=10;
}
}
//第一个数不能为0
while(c[nc]==0&&nc>1) nc--;
//反向输出
for(int i=nc;i>=1;i--)
{
printf("%d",c[i]);
}
return 0;
}
1459 巨型军团的测试3:加持
解题思路:
与上面一样。
treeoj 题目范围:
保证爆int类型,a是大整数类型的,b是整数类型的。
最强题解:
#include<cstdio>
#include<cstring>
int a[2005],c[2005];//储存数字
int b;
int na,nc;//储存数位长度
char s[2005];
int main()
{
memset(a,0,sizeof(a));
scanf("%s",s+1);
na=strlen(s+1);
for(int i=1;i<=na;i++)
{
a[na-i+1]=s[i]-'0';//翻转数字
}
scanf("%d",&b);
//确定乘积的数位
nc=na;
//乘法
for(int i=1;i<=nc;i++)
{
c[i]=a[i]*b;
}
//处理进位
for(int i=1;i<=nc;i++)
{
if(c[i]>9)
{
c[i+1]+=c[i]/10;
c[i]%=10;
if(i==nc) nc++;
}
}
//反向输出
for(int i=nc;i>=1;i--)
{
printf("%d",c[i]);
}
return 0;
}