关于C++基础算法--高精度计算(1)

  PS:我也不知道为什么无聊写了这篇博客,有需要的可以看一看。(完整程序在最后)

  利用计算机进行数值计算,有时会遇见这样的问题:有些计算要求精度高,希望计算的数的位数可达上百位。虽说计算机本身精度已经很高了,但是因为受到硬件的限制,往往达不到实际问题所要求的精度。我们可以设计出程序去实现这样的高精度算法去解决这样的问题。在这里分析一下高精度加法。

  高精度加法的程序可以分为以下几个步骤:

一.先定义两个字符数组和三个整型数组,如:

char n1[205],n1[205];

int a[205],b[205],c[205];

为什么是三个呢???

因为我们用数组c输出最终结果。

思路就是:c[i]=a[i]+b[i]+x;

当然,还有进位,我们用x代替。

二.将整型数组“清零”:

1.定义全局变量;

2.用函数“清零”:

memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));

三.输入,取长度:

gets(n1);int lena=strlen(n1);

gets(n2);int lenb=strlen(n2);

四.将它们(整型数组)转换类型逆序储存:

for(int i=0;i<lena;i++)
	a[lena-i]=a1[i]-'0';
for(int i=0;i<lenb;i++)
	b[lenb-i]=b1[i]-'0';
五.定义lenc=1(位数),x=0(进位(其实在两个加数的加法中,x只会为1或0)),该计算了:

while(lenc<=lena||lenc<=lenb)
{
	c[lenc]=a[lenc]+b[lenc]+x;
	x=c[lenc]/10;
	c[lenc]%=10;
	lenc++;
}
当然,还要考虑更高一位的x,也就是进位,那么只要把x的值给现在的c[lenc]就行了:

c[lenc]=x;

六.lenc是我们用来计算结果位数的,但现在lenc并不在结果的最高位,那么我们可以用如下方法去除前导“0”:

while(c[lenc]==0&&lenc>1)
{
	lenc--;
}
解释:只要c[lenc]为0并且不是最后一位,就把lenc--,直到找到结果最高位为止。

七.经过这么多步骤,终于可以输出了:

for(int i=lenc;i>=1;i--)
{
	printf("%d",c[i]);
}
好吧,不知道你是否明白了?如果还是没有明白,那就去看书吧!

最后附上完整的程序:

#include<cstdio>
#include<cstring>
int main()
{
	char a1[205],b1[205];
	int a[205],b[205],c[205],lena,lenb,lenc=1,x=0;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	gets(a1);
	gets(b1);
	lena=strlen(a1);
	lenb=strlen(b1);
	for(int i=0;i<lena;i++)
		a[lena-i]=a1[i]-'0';
	for(int i=0;i<lenb;i++)
		b[lenb-i]=b1[i]-'0';
	while(lenc<=lena||lenc<=lenb)
	{
		c[lenc]=a[lenc]+b[lenc]+x;
		x=c[lenc]/10;
		c[lenc]%=10;
		lenc++;
	}
	c[lenc]=x;
	while(c[lenc]==0&&lenc>1)
	{
		lenc--;
	}
	for(int i=lenc;i>=1;i--)
	{
		printf("%d",c[i]);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值