这是一个经典的上机题目,要求输入两个数字字符串,实现任何长度的加法,供上机笔试的同学参考
/*
Name:
Copyright:
Author:
Date:
Description: 高精度加法
*/
#include
using namespace std;
//这里为最大位数 的长度
#define N 100
void swap(char *s , int p ,int r)
{
char tem;
int i,j;
for(i=p,j=r;i=0&&j>=0;i--,j--,k++)
{
t=s1[i]-'0'+s2[j]-'0'+tem;
ret[k]=t%10+'0';//转化为字符串
tem=t/10;//表示进位
}
if(s1len==s2len)
{
if(tem)
{
ret[k]=tem + '0' ;
swap(ret,0,k);
}
else
{
swap(ret,0,k-1);
}
return ;
}
if(s1len>s2len)
{
for(;i>=0;i--,k++)
{
t=s1[i]-'0'+tem;
ret[k]=t%10+'0';
tem=t/10;
}
}
else
{
for(;j>=0;j--,k++)
{
t=s2[j]-'0'+tem;
ret[k]=t%10+'0';
tem=t/10;
}
}
if(tem==0)
{
swap(ret,0,k-1);
}
else
{
ret[k]=tem+'0';
swap(ret,0,k);
}
}
void jToSub(char *s1, char *s2,char *ret)
{//前面已经保证 计算的结果为正数
int i,j,k;
int len1=strlen(s1);
int len2=strlen(s2);
//最开始没有借位
bool jw=0;
for(k=0,i=len1-1,j=len2-1 ;i>=0 && j>=0; i--,j--,k++)
{
if(jw)
s1[i]-=1;
if(s1[i] - s2[j]<0)
{
jw = 1;
s1[i]+=10;
}
else
jw = 0;
ret[k] = s1[i] - s2[j] +'0';
}
if(len1>len2)
{
for(;i>=0 ;i--, k++)
{
if(jw)
s1[i]-=1;
if(s1[i] < '0')
{
jw = 1;
s1[i]+=10;
}
else
jw = 0;
ret[k] = s1[i]; // 这里没有 + '0'
}
}
for(i=len1 -1 ;i>=0;i--)
{
if(ret[i] == '0')
{
ret[i] = '\0';
}
else
break;
}
swap(ret,0,i);
}
///////////////////////////////////////////////////
void AddByStr(char *s1, char *s2,char *ret)
{
int i ,j;
if(s1[0]!='-'&&s2[0]!='-')
{
jtoAdd(s1,s2,ret);
return ;
}
if(s1[0]=='-'&&s2[0]=='-')
{
ret[0]='-';
jtoAdd(s1+1,s2+1,ret+1);
return ;
}
//一正一负
//假定2是正的
int sz=2;
i=1;
j=0;
if('-' != s1[0])
{
i=0;
j=1;
sz=1;
}
int cmp;
int cdc = strlen(s1+i) - strlen(s2+j);
if(cdc == 0)
{
cmp = strcmp(s1+i,s2+j);
if(!cmp)
{
ret[0] = '0';
return;
}
if(sz==1 && cmp>0 )
//最后结果为正
{
jToSub(s1+i, s2+j, ret);
return ;
}
if(sz ==1 && cmp<0)
{
ret[0] = '-';
jToSub(s2+j,s1+i, ret+1);
return ;
}
if(sz == 2 && cmp<0)
{
jToSub(s2+j,s1+i, ret);
return ;
}
if(sz == 2 && cmp>0)
{
ret[0] = '-';
jToSub(s1+i, s2+j, ret+1);
return ;
}
}
else
{
if(1 == sz && cdc > 0 )
{
jToSub(s1+i, s2+j, ret);
return;
}
if(1 == sz && cdc<0 )
{
ret[0] = '-';
jToSub(s2+j,s1+i, ret+1);
return ;
}
if(2 == sz && strlen(s1+i) < strlen(s2+j) )
{
jToSub(s2+j,s1+i, ret);
return ;
}
if(2 == sz && strlen(s1+i) > strlen(s2+j) )
{
ret[0] = '-';
jToSub(s1+i, s2+j, ret+1);
return ;
}
}
}
///////////////////////////////////////
//这个函数用于判断输入是否合法,如果合法则将字串整形
bool LargeAdd(char *s1, char *s2,char *ret)
{
int i,j;
int len1, len2;
bool s10=0,s20=0;
for(i=0;i='0' && s1[0]<='9')
{
len1=strlen(s1);
for(i=1;i='0' && s1[i]<='9')
{}
else
return false;//输入不合法
}
//执行到这里,输入合法
//去掉多余的0
i=0;
if('-' == s1[0])
i=1;
for(j=i;j='0' && s2[0]<='9')
{
len2=strlen(s2);
for(i=1;i='0' && s2[i]<='9')
{}
else
return false;//输入不合法
}
//去掉多余的0
i=0;
if('-' ==s2[0])
i=1;
for(j=i;j printf("输入不合法");
else
printf(" = %s", ret);
printf("\n");
system("PAUSE");
}