//看到网上有一种方法是逆序存储在计算输出的,所以想了一种不要逆序的
//感觉自己写的有很多地方可以优化。。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
void Plus(char *addend1,char *addend2,char *result)
{
int short_arr[MAX]={0},long_arr[MAX]={0},plus[MAX]={0};
int i,l,length1,length2,ends,endl;
//ends记录较短数据在short_arr数组中的尾部位置
//endl记录较长数据在long_arr数组中的尾部位置
length1=strlen(addend1);
length2=strlen(addend2);
if(length1>=length2)
{
for(i=0;i<length1;i++)
{
long_arr[i]=addend1[i]-'0';
}
for(i=0;i<length2;i++)
{
short_arr[i]=addend2[i]-'0';
}
l=length1;
ends=length2-1;
endl=length1-1;
}
else
{
for(i=0;i<length1;i++)
{
short_arr[i]=addend1[i]-'0';
}
for(i=0;i<length2;i++)
{
long_arr[i]=addend2[i]-'0';
}
l=length2;
ends=length1-1;
endl=length2-1;
}
//根据数据长度进行存储转化(char -->int)
for(i=l;ends>=0;ends--,endl--,i--)
{
plus[i]+=short_arr[ends]+long_arr[endl];
if(plus[i]>=10)
{
plus[i-1]++;
plus[i]-=10;
}
}
for(;endl>=0;endl--,i--)
{
plus[i]+=long_arr[endl];
if(plus[i]>=10) //大于10进位
{
plus[i-1]++;
plus[i]-=10;
}
}
//对应数组元素进行加法运算并将和存储在plus数组中
/*因为结果的长度要么等于最大的一个数据长度,要么比它大1,所以我将result数组的第一个
位置空出来用来存放最高位(0 or 1)。
*/
if(plus[0]==0)
result[0]=plus[0]+'0';
if(plus[0]==1)
result[0]=plus[0]+'0';
if(plus[0]==0)
{
for(i=1;i<=l;i++)
result[i-1]=plus[i]+'0';
result[i-1]='\0';
}
if(plus[0]==1)
{
for(i=1;i<=l;i++)
result[i]=plus[i]+'0';
result[i]='\0';
}
}
//将结果进行存储转化(int -->char)。别忘了最后在结尾加上'\0'
int main()
{
char addend1[MAX],addend2[MAX],result[MAX];
gets(addend1);
gets(addend2);
Plus(addend1,addend2,result);
puts(result);
return 0;
}
高精度加法
最新推荐文章于 2016-11-26 13:06:03 发布