大数想减

#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;
	 
	 

 

posted @ 2012-07-25 17:14  加拿大小哥哥  阅读(175)  评论(0编辑  收藏  举报