高精度整数加法
要求实现函数:
void add (const char *num1, const char *num2, char *result)
【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-'
num2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-'
【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。
注:
I、 当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;
II、 输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现;
III、 要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。
示例
输入:num1 = "580"
num2 = "-50"
输出:result = "530"
输入:num1 = "580"
num2 = "-600"
#include <stdio.h>
#include <assert.h>
#include <string.h>
void convert(char *str) ///字符串倒序
{
int lent=strlen(str);
for (int i=0;i<=(lent-1)/2;i++)
{
int temp=str[i];
str[i]=str[lent-1-i];
str[lent-1-i]=temp;
}
}
void add (const char *num1, const char *num2, char *result)
{
assert(num1!=NULL && num2!=NULL && result!=NULL);
int len1=strlen(num1); //串长
int len2=strlen(num2);
int ret[100]={0};
char *pNum1=(char*)num1;
char *pNum2=(char*)num2;
char *pResult=result;
bool IsNum1PosInt=true; 判断符标记
bool IsNum2PosInt=true;
bool IsExchange=false; ///是否交换两个数的信息标志位,将绝对值大的数放在第一个数上。
if (*pNum1=='-')
{
IsNum1PosInt=false;
pNum1++;
len1--;
}
if (*pNum2=='-')
{
IsNum2PosInt=false;
pNum2++;
len2--;
}
if (*pNum1=='0' || *pNum2=='0') /判断输入数据是否合格
{
printf("error input!");
return;
}
if (len1<len2) num1绝对值小于num2
{
IsExchange=true;
}
else
if(len1==len2) ///长度相等的情况下,是否需要交换
{
int j=0;
for (j=0;j<len1;j++)
{
if (pNum1[j]<pNum2[j])
{
IsExchange=true;
}
else
break;
}
}
if (IsExchange)
{
char *temp=pNum1;交换字符串
pNum1=pNum2;
pNum2=temp;
temp=NULL;
int lentemp=len1;交换长度信息
len1=len2;
len2=lentemp;
bool IsPostemp=IsNum1PosInt;
IsNum1PosInt=IsNum2PosInt;
IsNum2PosInt=IsPostemp;
}
convert(pNum1);
convert(pNum2);
if (!IsNum1PosInt^IsNum2PosInt) 同为正或者同为负
{
int i=0;
for (i=0;i<len1;i++)
{
if (i>=len2) //后面的都置为'0'
{
pNum2[i]='0';
}
ret[i]+=(pNum1[i]-'0')+(pNum2[i]-'0');
if (ret[i]>=10)
{
ret[i]=ret[i]%10;
ret[i+1]++;
}
}
if (!IsNum1PosInt) ///判断是两正数相加还是两负数相加
{
pResult[0]='-';
pResult++;
}
if (ret[i]==1) ///如果有进位,长度加1
{
len1++;
}
}
else ///如果为一正一负,大数在前,小数在后,相减
{
int i=0;
for (i=0;i<len1;i++)
{
if (i>=len2)
{
pNum2[i]='0';
}
ret[i]+=(pNum1[i]-'0')-(pNum2[i]-'0');
if (ret[i]<0) 如果小于0,则需要借位。
{
ret[i]+=10;
ret[i+1]--;
}
}
if (ret[len1-1]==0)
{
len1--;
}
if (!IsNum1PosInt)
{
pResult[0]='-';
pResult++;
}
}
for (int j=0;j<len1;j++) //将整型数组转换成字符串保存到结果字符串中
{
pResult[j]=*((char*)(ret+len1-1-j))+'0';
}
}
void main()
{
char n1[100]="-90";
char n2[100]="50";
char ret[100]="";
add(n1,n2,ret);
puts(ret);
}