您的位置:首页 > 其它

高精度计算----加法运算(续)

2009-08-05 11:03 197 查看
在上一贴的基础上,增加可以对浮点数进行运算,依旧是加法运算。
补充的说明:

1、相加函数不变,为了更能实现移植吧,写太多东西在一个函数里面看的也乱;

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';
}

/************************************************************************/
/* 函数功能:返回小数点后的个数,并修改a,b数组为正整型                 */
/* 先找出小数点的位置,比较小数点后的个数,返回比较大的个数,不足的那个补0 */
/************************************************************************/
int decimal(char a[],char b[])
{
	int i,j,k,l1,l2;
	l1=strlen(a);
	l2=strlen(b);
	for (i=0;i<l1;i++)
	{
		if (a[i]=='.')                    //找到小数点位置,然后删除小数点
		{
			for (k=i;k<l1;k++)
			{
				a[k]=a[k+1];
			}
			l1--;                         //长度减少
			break;
		}
	}
	for (j=0;j<l2;j++)
	{
		if (b[j]=='.')
		{
			for (k=j;k<l2;k++)
			{
				b[k]=b[k+1];
			}
			l2--;
			break;
		}
	}
	k=(l1-i)-(l2-j);                        //比较两个数组谁的小数位更多
	if (i==l1 && j==l2)                     //都没有小数点的话,返回0
	{
		return 0;
	}
	else if (k>=0)                           //被加数更多,b[]数组后面对齐补0
	{
		while (k!=0)
		{
			b[l2++]='0';
			k--;
		}
		return l1-i;                          //返回a[]的小数位数
	}
	else if (k<0)                             //加数更多,a[]数组后面对齐补0
	{
		k=k*-1;                               //记住k要变为正的
		while (k!=0)
		{
			a[l1++]='0';
			k--;
		}
		return l2-j;
	}
}

/************************************************************************/
/* 处理结果数组                                                         */
/* 将数组小数点后面的后移,插入小数点                                    */
/* 处理小数点某位0的情况,要去掉,若是小数点后不含任何数,小数点也要去掉   */
/************************************************************************/
void result(char c[],int n)
{
	int i,j,k,length;
	length=strlen(c);
	for (i=length;i>length-n;i--)                 //数组后移length-n大小
	{
		c[i]=c[i-1];
	}
	c[length-n]='.';                              //插入小数点
	for (i=length;i>=length-n;i--)
	{
		if (c[i]!='0' && i!=length-n)             //当不在小数点上面的时候,不为0直接退出
		{
			break;
		}
		else                                       //将0置为结束符,包括特定情况时去掉小数点
		{
			c[i]='/0';
		}
	}	
}

/************************************************************************/
/* 主函数实现                                                           */
/************************************************************************/
int main()
{
	int n,k;
	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);
		k=decimal(a,b);
		add(a,b,c);
		if (k!=0)
		{
			result(c,k);
		}		
		printf("%s%s/n/n","加法后结果为: ",c);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: