神犇营-my1034-A + B = C

【小韦同学@神犇营-my1034-A + B = C】

题目:

描述

读入三个数,判断是否存在一个数,是另外两个数的和。

输入

输入一行三个整数,每两个数用空格分开,每个数的范围在(-10^100, 10^100)。
注意:负数以 - 开头,正数不会有前置 + ,不会有前导 0。

输出

若存在一个数是另外两个数的和,输出“yes”,否则输出“no”。

输入样例1

12 5 7

输出样例1

yes

输入样例2

-8 15 7

输出样例2

yes

题解:

/********************************************************************* 

* 题目:神犇营-my1034-A + B = C 
* 作者:小韦同学 
* 邮箱:weichangying_wcy@163.com 

* 题解:
	思路:
	分别考虑三种情况:A + B = C,A + C = B,B + C = A,以A + B = C为例:
	若A、B都为正,则A + B为高精度加法;若A、B都为负,则先将负号输出出来,
	再将A、B的绝对值相加(高精度加法);若A、B为一正一负,则为高精度减
	法。其他两种情况可类比得出。

*********************************************************************/ 

#include<bits/stdc++.h>
using namespace std;

int sign[3]; // 保存符号 -1为-,0为+ 
int num[3][110]; // 保存数字 
string strs[3]; // 数字的字符串格式 
int len_num[3]; // 保存数字长度 
int result_num[110]; // 保存结果数字 
int result_sign; // 保存结果符号 
int result_len; // 保存结果长度
bool flag = true; // 是否继续选择两个数来求和

int main(){
    freopen("5.in", "r", stdin);
    freopen("5.out", "w", stdout);
    int m = 3;
    string str;
	while(m--){
        cin >> str;
        if(str[0] == '-'){
            sign[m] = -1;
        	str.erase(str.begin());
        }
        strs[m] = str;
        int len = str.size();
        for(int i = 0; i < len; i++){
            num[m][i] = str[len-1-i] - '0';
        }
        len_num[m] = len;
    }
    
    for(int k = 0; k < 3; k++){ // 依次判断3种情况
        if(flag == false) break; // 如果已经有yes的结果,则不再继续
    	int a = k % 3, b = (k + 1) % 3, c = (k+2) % 3;
    	
    	for(int i = 0; i < 110; i++) result_num[i] = 0; // 清空 
    	
    	if(sign[a] == sign[b]){ // 同号,则直接数值相加,符号不变 
    		int len = max(len_num[a], len_num[b]);
			 
    		for(int i=0; i<len; i++){
				result_num[i] += (num[a][i] + num[b][i]); // 将a、b各自第i位求和,加到结果第i位上 
				result_num[i+1] += result_num[i] / 10; // 处理进位 
				result_num[i] %= 10; // 计算去掉进位后剩余的值 
			}
			
			while(result_num[len]){ // 最高位有可能需要进位,处理 
				len++;
				result_num[len] += result_num[len-1] / 10;
				result_num[len-1] %= 10;
			}
			result_len = len; 
			result_sign = sign[a];
			
			
		}else{ // 异号,则相减 
			if(sign[a] == -1) swap(a, b); // 如果a是负数,则换为用b减a
			
			// 判断a和b的绝对值哪个大,如果b的大,则需要交换a,b,而且结果为负值 
			if(len_num[a] < len_num[b] || (len_num[a] == len_num[b] && strs[a] < strs[b])){
				swap(a, b);
				result_sign = -1;
			}else{
				result_sign = 0;
			}
			int len = max(len_num[a], len_num[b]);
			for(int i=0; i<len; i++){
				result_num[i] += (num[a][i] - num[b][i]);
				if (result_num[i] < 0){
					result_num[i+1]--;
					result_num[i] += 10;
				}
			}
			// 去掉高位多余的0 
			while (len>1 && result_num[len-1]==0) len--;
			result_len = len;
			
		}
		
		// 判断是否相等 
		if(result_sign == sign[c] && len_num[c] == result_len){
			int idx = 0;
			while(idx < len_num[c]){
				if(num[c][idx] != result_num[idx]){
					break;
				}
				idx++;
			}
			if(idx == len_num[c]){
                cout << "yes";
                flag = false;
            } 
		}
	}
    if(flag == true) cout << "no";
    return 0;
}

我是小韦同学,企者不立,跨者不行,每天进步一点点。
欢迎大家多多交流,如果发现有错误,请多指正。有疑问的同学也可以留言评论或者发邮件。
邮箱:weichangying_wcy@163.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值