【小韦同学@神犇营-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