鱼C论坛

 找回密码
 立即注册
查看: 1136|回复: 5

[已解决]L1-025 正整数A+B

[复制链接]
发表于 2020-9-27 22:47:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
输入格式:
输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

输出格式:
如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?。

我的代码:
#include <bits/stdc++.h>

using namespace std;

int main()
{
    //string str1, str2;
    string str;
    bool flag1 = true, flag2 = true;
    int num1 = 0, num2 = 0, i;
    getline(cin, str);

    for (i = 0; i < str.length(); i++){
        if(str[i] == ' '){
            if(i == 0)
                flag1 = false;
            break;
        }
        num1 = num1 * 10 + str[i] - '0';
        if(str[i] > '9' || str[i] < '0' || num1 > 1000){
            flag1 = false;
            break;
        }
    }
    while(str[i++] != ' ') ;
    for (; i < str.length(); i++)
    {
        if(str[i] == ' ')
            break;
        num2 = num2 * 10 + str[i] - '0';
        
        if (str[i] > '9' || str[i] < '0' || num2 > 1000)
        {
            flag2 = false;
            break;
        }
    }

    if(flag1 && flag2)
        cout << num1 << " + " << num2 << " = " << num1 + num2 << endl;
    else{
        if(flag1)
            cout << num1;
        else
            cout << "?";
        cout << " + ";
        if(flag2)
            cout << num2;
        else
            cout << "?";
        cout << " = ?" << endl;
        //cout << (flag1 == true ? num1 : '?') << " + " << (flag2 == true ? num2 : '?') << " = " << '?' << endl;
    }

    system("pause");
    return 0;
}
最佳答案
2020-9-27 23:05:53
之前做过的代码
#include <iostream>
#include <string>
using namespace std;

int to_int(string &num){
    int ans = 0;
    for(int i = 0; i < num.size(); ++i){
        ans = ans * 10 + num[i]-'0';
    }
    return ans;
}

int main(){
    string num1 = "", num2 = "";
    cin >> num1;
    cin.get();
    getline(cin,num2);
    for(int i = 0; i < num1.size(); ++i){
        if(num1[i]<'0'||num1[i]>'9'){
            num1 = "?";
            break;
        }
    }
    for(int i = 0; i < num2.size(); ++i){
        if(num2[i]<'0'||num2[i]>'9'){
            num2 = "?";
            break;
        }
    }
    
    if(num1!="?"&&(to_int(num1)<1||to_int(num1)>1000))num1 = "?";
    if(num2!="?"&&(to_int(num2)<1||to_int(num2)>1000))num2 = "?";
    string ans = "";
    if(num1=="?"||num2=="?"){
        ans = "?";
    }
    else {
        ans = to_string(to_int(num1)+to_int(num2));
    }
    
    cout << num1 << " + " << num2 << " = " << ans; 
    
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-27 22:48:24 | 显示全部楼层
总是两个测试点过不去,我把字符串开始就是空格也考虑过了,中间多个空格也考虑过了,那俩测试点咋都过不去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-27 23:05:53 | 显示全部楼层    本楼为最佳答案   
之前做过的代码
#include <iostream>
#include <string>
using namespace std;

int to_int(string &num){
    int ans = 0;
    for(int i = 0; i < num.size(); ++i){
        ans = ans * 10 + num[i]-'0';
    }
    return ans;
}

int main(){
    string num1 = "", num2 = "";
    cin >> num1;
    cin.get();
    getline(cin,num2);
    for(int i = 0; i < num1.size(); ++i){
        if(num1[i]<'0'||num1[i]>'9'){
            num1 = "?";
            break;
        }
    }
    for(int i = 0; i < num2.size(); ++i){
        if(num2[i]<'0'||num2[i]>'9'){
            num2 = "?";
            break;
        }
    }
    
    if(num1!="?"&&(to_int(num1)<1||to_int(num1)>1000))num1 = "?";
    if(num2!="?"&&(to_int(num2)<1||to_int(num2)>1000))num2 = "?";
    string ans = "";
    if(num1=="?"||num2=="?"){
        ans = "?";
    }
    else {
        ans = to_string(to_int(num1)+to_int(num2));
    }
    
    cout << num1 << " + " << num2 << " = " << ans; 
    
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-27 23:35:37 | 显示全部楼层
#include <bits/stdc++.h>
using namespace std;

int main()
{
    //string str1, str2;
    string str;
    bool flag1 = true, flag2 = true;
    int num1 = 0, num2 = 0, i = 0;
    getline(cin, str);
    while (str[i++] == ' ');
    if (i != 0)i--;
    for (; i < str.length(); i++) {
        if (str[i] == ' ')break;
        if (str[i] > '9' || str[i] < '0') {
            flag1 = false;
            break;
        }
        else {
            num1 = num1 * 10 + str[i] - '0';
        }
    }
    while (str[i++] != ' ');
    for (; i < str.length(); i++)
    {

        if (str[i] == ' ' || str[i] > '9' || str[i] < '0')
        {
            flag2 = false;
            break;
        }
        else {
            num2 = num2 * 10 + str[i] - '0';
        }
    }
    if (num1 < 1 || num1 > 1000)flag1 = false;
    if (num2 < 1 || num2 > 1000)flag2 = false;
    if (flag1 && flag2)
        cout << num1 << " + " << num2 << " = " << num1 + num2 << endl;
    else {
        if (flag1)
            cout << num1;
        else
            cout << "?";
        cout << " + ";
        if (flag2)
            cout << num2;
        else
            cout << "?";
        cout << " = ?" << endl;
        //cout << (flag1 == true ? num1 : '?') << " + " << (flag2 == true ? num2 : '?') << " = " << '?' << endl;
    }

    system("pause");
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-27 23:36:14 | 显示全部楼层
过滤掉开头的空格,以及对数字范围的判断就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-28 10:16:07 | 显示全部楼层
baige 发表于 2020-9-27 23:36
过滤掉开头的空格,以及对数字范围的判断就可以了

噢噢噢,我知道了,谢谢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 03:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表