山东济宁省建设厅官方网站,国际域名和国内域名区别,网站开发网站制作,简述网站开发的基本原则哎呀#xff0c;又是看似简单的AB模型#xff0c;这题确实也是AB#xff0c;不过这个题让我debug1个多小时才找出来问题所在#xff0c;服了#xff0c;真是所谓细节决定成败#xff0c;这题也挺值得记录下来的#xff0c;话不多嗦#xff0c;看题 题的目标很简单…
哎呀又是看似简单的AB模型这题确实也是AB不过这个题让我debug1个多小时才找出来问题所在服了真是所谓细节决定成败这题也挺值得记录下来的话不多嗦看题 题的目标很简单就是求两个正整数A和B的和其中A和B都在区间[1,1000]。稍微有点麻烦的是输入并不保证是两个正整数。
输入格式
输入在一行给出A和B其间以空格分开。问题是A和B不一定是满足要求的正整数有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格并且B不是一个空字符串。
输出格式
如果输入的确是两个正整数则按格式A B 和输出。如果某个输入不合要求则在相应位置输出?显然此时和也是?。
输入样例1
123 456输出样例1
123 456 579输入样例2
22. 18输出样例2
? 18 ?输入样例3
-100 blabla bla...33输出样例3
? ? ? 其他正常的我不说对于这题最恶心的地方总结一下并给出解决方法
有些特殊案例过不了也就是在这个地方
对于数据的输入这里一定一定要看清A和B的区别A可以为空字符串第一个空格后面都是B
因此我们在输入时应该注意假如A为空字符串的情况此时用cin呀scanf呀都不好读入因为cin会跳过前面的空格直到读到字符如图 因此我在网上找那些先cin在getchar()吸收空格在getline这种说法无法解决这个A为空串时的问题。最好的方法应该是直接当一行大字符串读入然后去找第一个空格把前面的截掉就是A后面的就都算B这样最简单因为可以判断这个大字符串假如第一个就是空格那A就是空字符串这样就解决了判断A是否为空字符串的问题
这里只给让我debug最久的一个步骤剩下对于大字符串具体的操作处理方法这里给出详细代码
代码如下
#includeiostream
#includestring
using namespace std;
bool a_ifsuit true, b_ifsuit true;//这里设置两个布尔数组判断a和b是否满足题意需要保留下来
int sum1, sum2;//设置a和b为数字时表示的值int main()
{string S;//由于a可以为空字符串我们直接输入一行来处理getline(cin, S);//处理S的过程for (int i 0; i S.size(); i) {//从前往后遍历找a到第一个空格停止if (S[i] ) {//找到a的位置之后就是对a的判断以及转化if (i 0) a_ifsuit false;int base 1;for (int j i - 1; j 0; j--) {//假如找到不是代表数字的字符直接退出循环if (S[j] 0 || S[j]9) {a_ifsuit false;break;}//否则把每个数字从后往前迭代加起来,相当于个位十位百位等等一个一个加不同位数乘以不同的base值else {sum1 base * (S[j]-0);base * 10;}}//判断加起来的数是否在题给的区间if (sum1 1000 || sum1 0) a_ifsuit false;//此时空格后面的就都是b了这里和上面一样判断b假如都是数字就转化bbase 1;//由于b也是从个位开始计算和因此这里把base值设回1for (int j S.size() - 1; j i; j--) {if (S[j] 0 || S[j]9) {b_ifsuit false;break;}else {sum2 base * (S[j] - 0);base * 10;}}if (sum2 1000 || sum2 0) b_ifsuit false;//最后通过a和b是否保留下来数字进行输出if (a_ifsuit b_ifsuit) cout sum1 sum2 sum1 sum2;else if (a_ifsuit !b_ifsuit) cout sum1 ? ?;else if (!a_ifsuit b_ifsuit) cout ? sum2 ?;else cout ? ? ?;break;}}return 0;
}