高精度加减法,用的是一个模版,不能解决前导0的问题,但是很好用。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void sub(char s1[],char s2[],char t[])
{
int i,j,l2,l1,k;
l2 = strlen(s2);
l1 = strlen(s1);
if(l2 > l1){
printf("-");
sub(s2,s1,t);
}else if(l2==l1){
if(strcmp(s1,s2)<0){ //负数情况
printf("-");
sub(s2,s1,t);
}else{
goto sb;
}
}else{
sb: t[l1]='\0'
l1--;
for(i=l2-1;i>=0;i--,l1--)
{
if(s1[l1]-s2[i]>=0){
t[l1]=s1[l1]-s2[i]+?'
}else{
t[l1] = 10+s1[l1]-s2[i]+?'
s1[l1-1] = s1[l1-1]-1; //退位
}
}
k = l1;
while(k>=0&&s1[k]<?'){
s1[k]+=10;
s1[k-1]-=1;
k--;
}
while(l1>=0){
t[l1]=s1[l1];
l1--;
}
while(t[0]==?'){
l1=strlen(s1);
for(i=0;i<l1-1;i++)
t[i]=t[i+1];
t[l1-1]='\0'
}
if(strlen(t)==0){
t[0]=?'
t[1]='\0'
}
} //else
}
void add(char a[],char b[],char back[])
{
int i,j,k,up,x,y,z,l;
char c[1010];
if (strlen(a)>strlen(b)){
l = strlen(a)+2;
}else{
l=strlen(b)+2;
}
i = strlen(a)-1;
j = strlen(b)-1;
k=0;
up=0; //进位标志
while(i>=0||j>=0)
{
if(i<0){
x=?'
}else{
x=a[i];
}
if(j<0){
y=?'
}else{
y=b[j];
}
z=x-?'+y-?'
if(up) z+=1;
if(z>9){
up=1;
z%=10;
}else{
up=0;
}
c[k++] = z+?'
i--;
j--;
}//while
if(up) c[k++]=?'
i=0;
c[k]='\0'
for(k-=1;k>=0;k--)
back[i++]=c[k];
back[i]='\0'
while(back[0]==?'){
l = strlen(back);
for(i=0;i<l;i++)
back[i] = back[i+1];
back[l-1] = '\0'
}
if(strlen(back)==0){
back[0]=?'
back[1]='\0'
}
}
int main()
{
char a[1010],b[1010],s[1010];
int l1,l2,i,j,k;
while(scanf("%s %s",a,b)!=EOF)
{
if(a[0]=='-' && b[0]=='-')
{
printf("-");
l1 = strlen(a);
j = 0;
for(i=1;i<=l1;i++)
{
a[j++] = a[i];
}
l2 = strlen(b);
j = 0;
for(i=1;i<=l2;i++)
{
b[j++] = b[i];
}
add(a,b,s);
puts(s);
}
else if(a[0]=='-' && b[0]!='-')
{
l1 = strlen(a);
j = 0;
for(i=1;i<=l1;i++)
{
a[j++] = a[i];
}
sub(b,a,s);
puts(s);
}
else if(a[0]!='-' && b[0]=='-')
{
l2 = strlen(b);
j = 0;
for(i=1;i<=l2;i++)
{
b[j++] = b[i];
}
sub(a,b,s);
puts(s);
}
else
{
add(a,b,s);
puts(s);
}
}
}