题目地址:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2000
#include<stdio.h>
#include<string.h>
int judge(char a[],char b[]);
int lena,lenb,a[502],b[502]; //lena为a字符串的长度,lenb为b字符串的长度,a,b为两个大整数
int main()
{
void init(char a1[],char b1[]);
void print(int a[]);
void minus(int a[],int b[]);
char a1[502],b1[501];
int i,j;
while(scanf("%s%s",a1,b1)!=EOF)
{
if(judge(a1,b1)>=0) //a数大于b数
{
init(a1,b1);
minus(a,b);
print(a);
}
else //b数大于a数
{
init(b1,a1);
minus(a,b);
printf("-");
print(a);
}
printf("\n");
}
return 0;
}
//初始化,将放在a,b两个char数组中的大整数移至int数组中,同时对被减数进行进位操作,比如223,则存的是数组中存为1 11 13
void init(char a1[],char b1[])
{
int i=0;
while(a1[i]!='\0')
{
a[i++]=a1[i]-48+9;
}
lena=i;
a[lena-1]++;
a[lena]=-1;
a[0]=a[0]-10;
i=0;
while(b1[i]!='\0')
{
b[i++]=b1[i]-48;
}
lenb=i;
}
//做减法与进位,因为初始化(init函数)的缘故,在减的同时只需要考虑进位
void minus(int a[],int b[])
{
int i,j,t=0; //t代表进位
for(i=lena-1,j=lenb-1;i>=0,j>=0;i--,j--) //相减并进位
{
a[i]=a[i]-b[j]+t;
t=0;
if(a[i]>=10)
{
a[i]=a[i]-10;
t=1;
}
}
for(;i>=0;i--) //进位
{
a[i]=a[i]+t;
t=0;
if(a[i]>=10)
{
a[i]=a[i]-10;
t=1;
}
}
}
void print(int a[]) //输出结果
{
int i=0;
while(a[i]==0)
{
i++;
}
if(a[i]==-1)
{
printf("0");
}
else
{
for(;i<lena;i++)
{
printf("%d",a[i]);
}
}
}
int judge(char a[],char b[]) //判断a,b两个数字的大小
{
if(strlen(a)>strlen(b))
{
return 1;
}
else if(strlen(a)<strlen(b))
{
return -1;
}
else
{
return strcmp(a,b);
}
}