• 【u216】A+B Problem(aplusb)


    Time Limit: 1 second
    Memory Limit: 128 MB

    【问题描述】

    对于给定的A和B,求A+B的值。


    【输入格式】

    输入文件aplusb.in的第1行为一个整数A,第2行为一个整数B。

    【输出格式】

    输出文件aplusb.out仅包括1行,A+B的值。

    【数据规模】

    对于100%的数据,A和B绝对值不超过10^100000,请注意A与B有可能为负数。

    Sample Input1

    1
    1
    
    
    
    
    
    

    Sample Output1

    2
    
    
    

    【样例说明】

    1+1=2

    【题解】

    这是一道关于高精度加法和减法结合的题。

    首先。我们用一个flag1和flag2两个bool型,来判断输入的A和B是否有负号。

    如果探测到有负号,就直接删掉这个负号。

    所以我们就获得了两个正数。

    然后根据flag1和flag2来判断用哪一个减去哪一个

    如果!flag1&&!flag2表示全都是正数。直接两个相加

    如果flag1&&flag2表示全都是负数。输出一个负号,然后两个数相加。

    如果flag1&&!flag2表示前面一个A是负数B是正数。则用B去减A(A去掉负号了);

    如果!flag1&&flag2表示前面一个A是正数B是负数,则用A减去B(B去掉负号了);

    在做减法的时候,要判断哪一个数比较大。然后要根据这个信息判断是否要输出负号。

    【代码】

    #include <cstdio>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    string s1,s2;
    int a[200001],b[200001],c[200001] = {0};
    
    void plu_s(string a1,string b1) //把a1和b1两个数相加 
    {
    	a[0] = a1.size(); //a1的长度 
    	for (int i = 1;i <= a[0];i++)
    		a[i] = a1[a[0]-i]-'0';	
    	b[0] = b1.size();
    	for (int i = 1;i <= b[0];i++)
    		b[i] = b1[b[0]-i]-'0';
    	int l = a[0]; 
    	if (b[0] > a[0])
    		l = b[0]; //l是两个数中长度更长的数的长度 
    	int x = 0;
    	for (int i = 1;i <= l;i++) //一边处理进位,一边做加法 
    		{
    			c[i] = a[i] + b[i] + x;
    			x = c[i] / 10;
    			c[i] = c[i] % 10;			
    		}
    	while (x > 0) //如果还能够进位则进位 
    		{
    			l++;
    			c[l] = x % 10;
    			x = x / 10;	
    		}
    	c[0] = l; //同时增加c答案数字的长度 
    }
    
    bool can(string s1,string s2) //比较s1是否能够减s2即s1>=s2是否成立 
    {
    	if (s1.size() > s2.size()) //如果s1的长度更长,则一定成立 
    		return true;
    	if (s1.size() < s2.size()) //如果s2的长度更长,则一定不成立 
    		return false;
    	if (s1.size() == s2.size()) //如果两个数的长度一样 就要具体到比较每个数字了 
    		{
    			for (int i = 1;i <= s1.size();i++)
    				if (s1[i] > s2[i]) //只要出现一个数字不相同就可以做出判断了 
    					return true;
    						else
    							if (s1[i] < s2[i])
    								return false;
    			return true; //全都一样 也可以减 
    		}
    }
    
    void subtract(string a1,string b1) //做减法 
    {
    	a[0] = a1.size(); //获取数字长度 把数字的长度放在a[0]是一个不错的选择 
    	for (int i = 1;i <= a[0];i++)
    		a[i] = a1[a[0]-i]-'0';	
    	b[0] = b1.size();
    	for (int i = 1;i <= b[0];i++)
    		b[i] = b1[b[0]-i]-'0';
    	int l = a[0];//已经判断出来a是可以减去b的,所以用a的数字长度就好 
    	for (int i =1;i<=l;i++) 
    		{
    			c[i]= c[i] + a[i]-b[i]; //这里不能写成c[i]=a[i]-b[i] ;因为有借位的问题 
    			if (c[i] < 0)
    				c[i]+=10,c[i+1]--;
    		}
    	while (c[l] == 0 && l >=2) 
    		l--;
    	c[0] = l; //最后要记得把新的长度赋值给c[0] 
    }
    
    int main()
    {
    	cin >> s1;
    	cin >> s2;
    	bool flag1 = false,flag2 = false; //得出A和B的正负情况 
    	if (s1[0] == '-')
    		flag1 = true,s1 = s1.erase(0,1);
    	if (s2[0] == '-')
    		flag2 = true,s2 = s2.erase(0,1);
    	if (!flag1 && !flag2) //根据正负情况做相应的加减法 
    		plu_s(s1,s2);
    	if (flag1 && flag2)
    		{
    			plu_s(s1,s2);
    			printf("-");
    		}
    	if (!flag1 && flag2) //第一个数为正数 第二个为负数 a-b 
    		{
    			if (!can(s1,s2))
    				{
    					printf("-");
    					subtract(s2,s1);
    				}
    				else
    					subtract(s1,s2);
    		}
    	if (flag1 && !flag2) //第一个数为负数 第二个为正数 b-a 
    		{
    			if (!can(s2,s1))
    				{
    					printf("-");
    					subtract(s1,s2);	
    				}
    				else
    					subtract(s2,s1);
    		}
    	for (int i = c[0];i >=1;i--)
    		printf("%d",c[i]);		
    	return 0;
    }


  • 相关阅读:
    linux命令
    常用正则表达式总结
    List集合对象根据字段排序
    IO字 节流/字符流 读取/写入文件
    Jquery广告浮动效果小案例
    拿到添加对象的id号方法
    Jquery省市区三级联动案例
    JAVA集合迭代遍历和特性介绍
    Listener监听器使用小案例
    java中用过滤器解决字符编码问题
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632355.html
Copyright © 2020-2023  润新知