大数想减
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int len1,len2;
int c[111];
int my_compare(int *a,int *b)
{
int flag;int i;
int max=(len1>=len2?len1:len2);
/*
实际上还可以先判断长度,若长度不同,则必然一大一小
长度相同时才用到下面的for循环
*/
/*
if(len1>len2)
return 1;
if(len1<len2)
return -1;
这样输入00 1的话,就会错误
*/
//else
{
for(i=max;i>=1;i--)//因为ab是倒着存储的,a[0]、b[0]未使用
if(a[i]>b[i])
{
flag=1;
break;
}
else if(a[i]<b[i])
{
flag=-1;
break;
}
else
continue;
}
if(0==i)
flag=0;
return flag;
}
void plus(int a[],int b[])
{
int i;
int len=(len1>=len2?len1:len2);
memset(c,0,sizeof(c));
for(i=1;i<=len;i++)
{
c[i]=a[i]+b[i];
if(c[i]>=10)
{
c[i+1]++;
c[i]=c[i]%10;
}
}
if(c[len+1]!=0)
len++;
for(i=len;i>=1;i--)
printf("%d",c[i]);
printf("\n");
}
void minus(int a[],int b[])//数组a的值大于数组b的
{
int i;
int len=(len1>=len2?len1:len2);
memset(c,0,sizeof(c));
for(i=1;i<=len;i++)
{
c[i]=a[i]-b[i];
if(c[i]<0)
{
a[i+1]--;
/*
if(a[i+1]<0)
{
a[i+1]+=10;
a[i+2]--;
}
*/
c[i]=c[i]+10;
}
}
while(c[len]==0)
len--;
for(i=len;i>=1;i--)
printf("%d",c[i]);
printf("\n");
}
int main()
{
int i,j;
int signal1,signal2;
char str1[110],str2[110];
int a[110],b[110];
while(~scanf("%s %s",str1,str2))
{
len1=len2=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
len1=strlen(str1);
len2=strlen(str2);
if(str1[0]=='-')
{
signal1=1;//1表示负数
len1--;
for(i=1;i<=len1;i++)
a[len1-i+1]=str1[i]-'0';
}
else
{
signal1=0;
for(i=1;i<=len1;i++)
a[len1-i+1]=str1[i-1]-'0';
}
if(str2[0]=='-')
{
signal2=1;
len2--;
for(i=1;i<=len2;i++)
b[len2-i+1]=str2[i]-'0';
}
else
{
signal2=0;
for(i=1;i<=len2;i++)
b[len2-i+1]=str2[i-1]-'0';
}
//主体
if(signal1==0&&signal2==0)
if(my_compare(a,b)>0)//a-b
minus(a,b);
else if(my_compare(a,b)<0)//b-a
{
putchar('-');
minus(b,a);
}
else
printf("0\n");
else if(signal1==0&&signal2==1)//a+b
plus(a,b);
else if(signal1==1&&signal2==0)
{
putchar('-');
plus(a,b);
}
else//b-a
{
if(my_compare(a,b)<0)
minus(b,a);
else if(my_compare(a,b)>0)//b-a
{
putchar('-');
minus(a,b);
}
else
printf("0\n");
}
}
//system("pause");
return 0;
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

浙公网安备 33010602011771号