treeoj 高精度入门

高精度

高精度就是爆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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值