整数高精度减法程序(相对完善)
在网上看到很多关于高精度减法程序,感觉都不是很完善,对于一些测试数据出现明显错误,比如:输入01 100 很显然应当输出-99而这些程序去没有考虑前置零的情况,再比如有些程序要求A-B时A>B必须成立,这是不好的,或者可以实现01-100=-99但是当结果出现前置零时又不能完善如000-99=-099就显得不太友好 -_-所以自己就做了一个功能相对完善的程序,自己还没有发现错误,在几个oj上运行也AC了,如果有一些错误希望各位学长学姐给小弟说下哈
//请最终劳动成果
#include "iostream"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
using namespace std;
//比较
int compare(char *s1,char *s2)
{
int n=0;
if(strlen(s1)<strlen(s2))
return 0;
if(strlen(s1)==strlen(s2))
{
for(int k=0;k<strlen(s1);k++)
if(s1[k]<s2[k])
return 0;
else if(s1[k]>s2[k])
return 1;
return 2;
}
return 1;
}
//减法
void sub(char s1[520],char s2[520],char back[520])
{
char Temp[520];
int p,q,r;
if(compare(s1,s2)==2)
{
back[0]='0';
back[1]='\0';
//puts(back);
return ;
}
else
{
int n=0;
p=strlen(s1),q=strlen(s2);
if(p>q)
{
for(int k=0;k<p-q;k++)
Temp[k]='0';
for(int k=p-q;k<p;k++)
Temp[k]=s2[n++];
}
else
Temp[0]='\0',strcat(Temp,s2);
for(n=p-1;n>=0;n--)
{
if(s1[n]-Temp[n]>=0)
back[n]=s1[n]-Temp[n]+'0';
else
{
back[n]=s1[n]-Temp[n]+10+'0';
s1[n-1]-=1;
}
}
back[p]='\0';
for(r=0;r<p;r++)
if(back[r]!='0')
break;
for(n=0;r<p;r++)
back[n++]=back[r];
back[n]='\0';
// puts(s1);puts(Temp);
//puts(back);
return ;
}
}
//加法
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));
i=strlen(a)-1;
j=strlen(b)-1;
k=0;up=0;
while(i>=0||j>=0)
{
if(i<0) x='0'; else x=a[i];
if(j<0) y='0'; else y=b[j];
z=x-'0'+y-'0';
if(up) z+=1;
if(z>9) {up=1;z%=10;} else up=0;
c[k++]=z+'0';
i--;j--;
}
if(up) c[k++]='1';
i=0;
c[k]='\0';
for(k-=1;k>=0;k--)
back[i++]=c[k];
back[i]='\0';
}
//主程序
int main()
{
char s1[520],s2[520],ch1,ch2,back[520];
int sign1,sign2;
while(scanf("%s%s",s1,s2)!=EOF)
{
back[0]='\0';
int p=0,q=0;
//符号初始化
sign1=1,sign2=1;
//获取符号
ch1=s1[0]=='-'?'-':'+';
ch2=s2[0]=='-'?'-':'+';
//标记符号
sign1=ch1=='+'?1:0;
sign2=ch2=='+'?1:0;
//被减数字符串处理
for(int k=0;k<strlen(s1);k++)
if(s1[k]>='0'&&s1[k]<='9')
s1[p++]=s1[k];
s1[p]='\0';
//减数字符串处理
for(int k=0;k<strlen(s2);k++)
if(s2[k]>='0'&&s2[k]<='9')
s2[q++]=s2[k];
s2[q]='\0';
//对被减数字符串存在前置零进行判断与处理
p=0,q=0;
for(q=0;q<strlen(s1)-1&&strlen(s1)>=2;q++)
if(s1[q]!='0')
break;
if(q>0)
{
for(;q<strlen(s1);q++)
s1[p++]=s1[q];
s1[p]='\0';
}
//对减数字符串存在前置零进行判断与处理
p=0,q=0;
for(q=0;q<strlen(s2)-1&&strlen(s2)>=2;q++)
if(s2[q]!='0')
break;
if(q>0)
{
for(;q<strlen(s2);q++)
s2[p++]=s2[q];
s2[p]='\0';
}
p=0,q=0;
//当被减数为负数、减数为正数
if(sign1==0&&sign2==1)
{
add(s1,s2,back);
if(back[0]=='0');
else
printf("-");
for(p=0;p<strlen(back);p++)
printf("%c",back[p]);
printf("\n");
continue;
}
//当被减数为正数、减数为负数
if(sign1==1&&sign2==0)
{
add(s1,s2,back);
for(p=0;p<strlen(back);p++)
printf("%c",back[p]);
printf("\n");
continue;
}
//当被减数与减数均为正数
if(sign1==1&&sign2==1)
{
if(compare(s1,s2))
{
sub(s1,s2,back);
printf("%s\n",back);
}
else
{
sub(s2,s1,back);
printf("-%s\n",back);
}
continue;
}
//当被减数与减数均为负数
else
{
if(compare(s1,s2))
{
sub(s1,s2,back);
if(back[0]=='0')
printf("%s\n",back);
else
printf("-%s\n",back);
}
else
{
sub(s2,s1,back);
printf("%s\n",back);
}
continue;
}
}
return 0;
}
//说明:只需输入A B 输出A-B