您的位置:首页 > 其它

高精度计算----加法运算

2009-08-05 09:19 211 查看
处理大数加法:

1.用数组来存储每位数,对每位数进行相加运算,要依加法原则,从低位开始运算。而数组是从高位开始存储的,所以要逆序处理运算。要处理进位和当前位超9处理。

2.这里的加法运算不包括负数计算,可以转换为相关的减法运算。

测试程序效果如下:



一下代码包含相加函数,测试的主函数,相加函数(附带注释)直接可以使用:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/************************************************************************/
/* 高精度加法运算														*/
/* a[]被加数,位数不限													*/
/* b[]加数,位数不限													*/
/* back[]结果,字符串保存                                               */
/************************************************************************/
void add(char a[],char b[],char back[])
{
	int i,j,k,up,x,y,z,l;
	char *c;							//存储结果的逆数组
	if (strlen(a)>strlen(b))			//判断位数哪个更大吗,取较长的位数,以防进位要多补一位和结束符
	{
		l=strlen(a)+2;
	}
	else
	{
		l=strlen(b)+2;
	}
	c=(char *)malloc(l*sizeof(char));	//动态开辟char类型l长度的字符串
	i=strlen(a)-1;						//取实际长度
	j=strlen(b)-1;
	k=0;up=0;							//k是c数组的下标,up代表进位标志
	while (i>=0 || j>=0)
	{
		if (i<0)						//当被加数位数过少的话,用0前补不足
		{
			x='0';
		}
		else
		{
			x=a[i];
		}
		if (j<0)						//当加数位数过少的话,用0前补不足
		{
			y='0';
		}
		else
		{
			y=b[j];
		}
		z=x-'0'+y-'0';					//加法运算
		if (up)							//对上一次的进位处理
		{
			z+=1;
		}
		if (z>9)						//超9处理
		{
			up=1;
			z%=10;
		}
		else
		{
			up=0;
		}
		c[k++]=z+'0';					//存入c数组
		i--;
		j--;
	}
	if (up)								//末次进位情况
	{
		c[k++]='1';
	}
	c[k]='/0';							//结束符
	for (k-=1,i=0;k>=0;k--)				//数组逆序赋给back结果数组
	{
		back[i++]=c[k];
	}
	back[i]='/0';
}

int main()
{
	int n;
	char a[1000],b[1000],c[1000];
	printf("%s","计算次数: ");	
	scanf("%d",&n);
	while (n--)
	{
		memset(a,'/0',sizeof(a));
		memset(b,'/0',sizeof(b));
		memset(c,'/0',sizeof(c));			
		printf("%s","请输入被加数: ");
		scanf("%s",&a);
		printf("%s","请输入加数:   ");
		scanf("%s",&b);
		add(a,b,c);
		printf("%s%s/n/n","加法后结果为: ",c);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: