• BUPT( 北邮)2 大数 AB


    A-B Problem
    Accept:627     Submit:5002
    Time Limit:1000MS     Memory Limit:65536KB
    Description
    Calculate A-B

    Input
    Two integer a and b(-10^100 < a,b < 10^100)

    Output
    Output a-b

    Sample Input

    1 2


    Sample Output

    -1


    Source
    BUPT Online Judge
    /*
       功能 Function Description:  大数 A-B 
       开发环境 Environment:       DEV C++ 4.9.9.1
       作者 Author:               可笑痴狂 
       日期 Date:                 20120725
       备注 Notes:
    */
    
    #include<stdio.h>
    #include<string.h>
    #define MAX 110
    char s1[MAX],s2[MAX],temp[MAX];
    int a[MAX],b[MAX];
    int len1,len2,i,j;
    
    void add(char *s1,char *s2)  //大整数加法
    {
    	for(i=len1-1,j=0;i>=0;--i)
    		a[j++]=s1[i]-'0';
    	for(i=len2-1,j=0;i>=0;--i)
    		b[j++]=s2[i]-'0';
    	for(i=0;i<MAX;++i)
    	{
    		a[i]+=b[i];
    		if(a[i]>=10)
    		{
    			a[i]-=10;
    			++a[i+1];
    		}
    	}
    }
    
    int judge(char *s1,char *s2)//判断s1的绝对值是否大于s2,如果大于则返回1,小于则返回0
    {
    	len1=strlen(s1);
    	len2=strlen(s2);
    	if(len1>len2)
    		return 1;
    	else if(len1==len2)
    	{
    		for(i=0;i<len1;++i)
    		{
    			if(s1[i]>s2[i])
    				return 1;
    			else
    				return 0;
    		}
    	}
    	else
    		return 0;
    }
    
    void sub(char *s1,char *s2)
    {
    	len1=strlen(s1);//防止变换后len1与len2互换
    	len2=strlen(s2);
    	for(i=len1-1,j=0;i>=0;--i)
    			a[j++]=s1[i]-'0';
    	for(i=len2-1,j=0;i>=0;--i)
    		b[j++]=s2[i]-'0';
    	for(i=0;i<MAX;++i)
    	{
    		a[i]-=b[i];
    		if(a[i]<0)
    		{
    			a[i]+=10;
    			--a[i+1];
    		}
    	}
    }
    
    int main()
    {
    	int flag;
    	while(scanf("%s%s",s1,s2)!=EOF)
    	{
    		if(strcmp(s1,s2)==0)//开始先排除0 的情况,以后不再判断
    		{
    			printf("0\n");
    			continue;
    		}
    		flag=0;
    		memset(a,0,sizeof(a));
    		memset(b,0,sizeof(b));
    		len1=strlen(s1);
    		len2=strlen(s2);
    		if(s1[0]!='-'&&s2[0]=='-'||s1[0]=='-'&&s2[0]!='-')    //情况一:A-(-B),等价于A+B  或者  情况二:-A-B,等价于-(A+B)
    		{
    			if(s1[0]=='-')
    			{
    				s1[0]='0';
    				flag=1;
    			}
    			if(s2[0]=='-')
    				s2[0]='0';//消去负号
    			add(s1,s2);
    			if(flag)
    				printf("-");
    		}
    		else					//情况三:A-B  情况四:-A-(-B)等价于B-A
    		{
    			if(s1[0]=='-') //把情况四转化为情况三
    			{
    				s1[0]='0';
    				s2[0]='0';
    				strcpy(temp,s1);
    				strcpy(s1,s2);
    				strcpy(s2,temp);
    			}
    			if(judge(s1,s2))
    				sub(s1,s2);
    			else
    			{
    				printf("-");
    				sub(s2,s1);
    			}
    		}
    		for(i=MAX-1;i>=0&&a[i]==0;--i);
    	//	if(i>=0)                      //屏蔽的代码可以烤炉0-(-0)的情况
    	//	{
    			for(;i>=0;--i)
    				printf("%d",a[i]);
    			printf("\n");
    	//	}
    	//	else
    	//		printf("0\n");
    	}
    	return 0;
    }
    
    功不成,身已退
  • 相关阅读:
    SQL 标准中的四种隔离级别
    java中快速排序的理解以及实例
    java中对插入排序的理解以及实例
    对冒泡排序的理解和实例
    MYSQL面试
    软件测试面试问题
    软件测试
    Linux常用命令
    关于将博客搬家至博客园的声明
    MFC常见问题以及解决方法(1)_MFC下文本编辑框按下回车后窗口退出
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2608754.html
Copyright © 2020-2023  润新知