鱼C论坛

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

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

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

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

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

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

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

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

我的代码:

  1. #include <bits/stdc++.h>

  2. using namespace std;

  3. int main()
  4. {
  5.     //string str1, str2;
  6.     string str;
  7.     bool flag1 = true, flag2 = true;
  8.     int num1 = 0, num2 = 0, i;
  9.     getline(cin, str);

  10.     for (i = 0; i < str.length(); i++){
  11.         if(str[i] == ' '){
  12.             if(i == 0)
  13.                 flag1 = false;
  14.             break;
  15.         }
  16.         num1 = num1 * 10 + str[i] - '0';
  17.         if(str[i] > '9' || str[i] < '0' || num1 > 1000){
  18.             flag1 = false;
  19.             break;
  20.         }
  21.     }
  22.     while(str[i++] != ' ') ;
  23.     for (; i < str.length(); i++)
  24.     {
  25.         if(str[i] == ' ')
  26.             break;
  27.         num2 = num2 * 10 + str[i] - '0';
  28.         
  29.         if (str[i] > '9' || str[i] < '0' || num2 > 1000)
  30.         {
  31.             flag2 = false;
  32.             break;
  33.         }
  34.     }

  35.     if(flag1 && flag2)
  36.         cout << num1 << " + " << num2 << " = " << num1 + num2 << endl;
  37.     else{
  38.         if(flag1)
  39.             cout << num1;
  40.         else
  41.             cout << "?";
  42.         cout << " + ";
  43.         if(flag2)
  44.             cout << num2;
  45.         else
  46.             cout << "?";
  47.         cout << " = ?" << endl;
  48.         //cout << (flag1 == true ? num1 : '?') << " + " << (flag2 == true ? num2 : '?') << " = " << '?' << endl;
  49.     }

  50.     system("pause");
  51.     return 0;
  52. }

复制代码
最佳答案
2020-9-27 23:05:53
之前做过的代码
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;

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

  11. int main(){
  12.     string num1 = "", num2 = "";
  13.     cin >> num1;
  14.     cin.get();
  15.     getline(cin,num2);
  16.     for(int i = 0; i < num1.size(); ++i){
  17.         if(num1[i]<'0'||num1[i]>'9'){
  18.             num1 = "?";
  19.             break;
  20.         }
  21.     }
  22.     for(int i = 0; i < num2.size(); ++i){
  23.         if(num2[i]<'0'||num2[i]>'9'){
  24.             num2 = "?";
  25.             break;
  26.         }
  27.     }
  28.    
  29.     if(num1!="?"&&(to_int(num1)<1||to_int(num1)>1000))num1 = "?";
  30.     if(num2!="?"&&(to_int(num2)<1||to_int(num2)>1000))num2 = "?";
  31.     string ans = "";
  32.     if(num1=="?"||num2=="?"){
  33.         ans = "?";
  34.     }
  35.     else {
  36.         ans = to_string(to_int(num1)+to_int(num2));
  37.     }
  38.    
  39.     cout << num1 << " + " << num2 << " = " << ans;
  40.    
  41.     return 0;
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

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

  11. int main(){
  12.     string num1 = "", num2 = "";
  13.     cin >> num1;
  14.     cin.get();
  15.     getline(cin,num2);
  16.     for(int i = 0; i < num1.size(); ++i){
  17.         if(num1[i]<'0'||num1[i]>'9'){
  18.             num1 = "?";
  19.             break;
  20.         }
  21.     }
  22.     for(int i = 0; i < num2.size(); ++i){
  23.         if(num2[i]<'0'||num2[i]>'9'){
  24.             num2 = "?";
  25.             break;
  26.         }
  27.     }
  28.    
  29.     if(num1!="?"&&(to_int(num1)<1||to_int(num1)>1000))num1 = "?";
  30.     if(num2!="?"&&(to_int(num2)<1||to_int(num2)>1000))num2 = "?";
  31.     string ans = "";
  32.     if(num1=="?"||num2=="?"){
  33.         ans = "?";
  34.     }
  35.     else {
  36.         ans = to_string(to_int(num1)+to_int(num2));
  37.     }
  38.    
  39.     cout << num1 << " + " << num2 << " = " << ans;
  40.    
  41.     return 0;
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. int main()
  4. {
  5.     //string str1, str2;
  6.     string str;
  7.     bool flag1 = true, flag2 = true;
  8.     int num1 = 0, num2 = 0, i = 0;
  9.     getline(cin, str);
  10.     while (str[i++] == ' ');
  11.     if (i != 0)i--;
  12.     for (; i < str.length(); i++) {
  13.         if (str[i] == ' ')break;
  14.         if (str[i] > '9' || str[i] < '0') {
  15.             flag1 = false;
  16.             break;
  17.         }
  18.         else {
  19.             num1 = num1 * 10 + str[i] - '0';
  20.         }
  21.     }
  22.     while (str[i++] != ' ');
  23.     for (; i < str.length(); i++)
  24.     {

  25.         if (str[i] == ' ' || str[i] > '9' || str[i] < '0')
  26.         {
  27.             flag2 = false;
  28.             break;
  29.         }
  30.         else {
  31.             num2 = num2 * 10 + str[i] - '0';
  32.         }
  33.     }
  34.     if (num1 < 1 || num1 > 1000)flag1 = false;
  35.     if (num2 < 1 || num2 > 1000)flag2 = false;
  36.     if (flag1 && flag2)
  37.         cout << num1 << " + " << num2 << " = " << num1 + num2 << endl;
  38.     else {
  39.         if (flag1)
  40.             cout << num1;
  41.         else
  42.             cout << "?";
  43.         cout << " + ";
  44.         if (flag2)
  45.             cout << num2;
  46.         else
  47.             cout << "?";
  48.         cout << " = ?" << endl;
  49.         //cout << (flag1 == true ? num1 : '?') << " + " << (flag2 == true ? num2 : '?') << " = " << '?' << endl;
  50.     }

  51.     system("pause");
  52.     return 0;
  53. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-27 23:36:14 | 显示全部楼层
过滤掉开头的空格,以及对数字范围的判断就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

噢噢噢,我知道了,谢谢~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 12:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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