#include<stdio.h>
#include<string.h>
#define N 100
int allDigit(char *s)
{
while(*s)
{
if(!(*s>='0'&&*s<='9'))
return 0;
s++;
}
return 1;
}
void input(char s[],int p[])
{
int len=strlen(s);
int i;
for(i=0;i<len;i++)
{
p[len-i]=s[i]-'0';
p[0]=len;
}
}
//判断a,b中存放的拆分数字的大小
//a大返回正值,b大返回负值,相等返回0
int cmp(int a[],int b[])
{//若a>b返回正数
//若a<b返回负数
//若a==b返回0
int len1,len2;
len1=a[0];
len2=b[0];
//计算除去前导0的数字长度,需考虑数字本身为0
while(a[len1]==0&&len1>1)
len1--;
a[0]=len1;
while(b[len2]==0&&len2>1)
len2--;
b[0]=len2;
if(len1>len2)
return 1;
if(len1<len2)
return -1;
while(len1>0)
{
//若数字等长,从最高位开始,逐次比较对应位
if(a[len1]==b[len1])
len1--;
else
return a[len1]-b[len1];
}
return 0;
}
int sub(int a[],int b[])
{
int sign=1;//值为-1表示负数
int i=cmp(a,b);
//若a==b
if(i==0)
{
a[1]=0;
a[0]=1;
return 0;
}
//a<b,则交换a,b的值,设置结果符合为负
if(i<0)
{
int c[N]={0};
memcpy(c , a , sizeof(int)*(b[0]+1));
memcpy(a , b , sizeof(int)*(b[0]+1));
memcpy(b , c , sizeof(int)*(b[0]+1));
sign=-1;
}
//a>b,直接计算,不必交换
for(i=1;i<=a[0];i++)
a[i]=a[i]-b[i];
if(a[i]<0)
{
a[i+1]--;
a[i]=a[i]+10;
}
//减法后可能出现前导0
for(i=a[0];i>1;i--)
if(a[i]==0)
a[0]--;
else
break;
return sign;
}
int main()
{
char s[N];
int a[N]={0},b[N]={0};
int i,sign;
printf("请输入数字串1:\n");
do
{
gets(s);
if(allDigit(s))
break;
}while(1);
input(s,a);
printf("请输入数字串2:\n");
do
{
gets(s);
if(allDigit(s))
break;
}while(1);
input(s,b);
sign=sub(a,b);
printf("计算结果是:");
if(sign<0)
{
printf("-");
}
for(i=a[0];i>=1;i--)
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}