『ACM C++』 PTA 天梯赛练习集L1 | 025-026
满课一天,做25的时候还疯狂WA,进度可以说是很慢了 哭泣
------------------------------------------------L1-025----------------------------------------------------------
正整数A+B
题的目标很简单,就是求两个正整数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:
? + ? = ?
------------------------------------------------L1-025----------------------------------------------------------
注解:这道题WA了我很久,直到某节英语课突然通关哈哈哈哈哈,这道题要注意很多东西:
①A和B同时输入,识别为负数则要输出问号
②A和B输入的大小不超过1000,否则要输出问号
③A可以为空,B不为空
④要处理A+B的结果,即要把字符串转为整型
⑤识别数字,如果乱码得输出为问号。
· 代码分块:
第一步:构建结构体存储A和B的内容及转码int值还有是否合法:
struct T{ char temp[9999999]; int is_empty = 0; int ans = 0; }temp_1,temp_2;
第二步:对结构体进行审核处理,构建特殊函数对结构体处理:
这里要注意:千万不能提前把0吃了,因为可能会出现04 08这样的情况,这样是符合题目条件的,输出4+8=12,因为得从sum加和结果判断是否为0,而不是凭输入。
void TempToAns(struct T &t) { int i = 0; t.ans = 0; base = 1; if(t.temp[0] == 45) t.is_empty = 1,i = 1; if(t.temp[0] == 32 ) t.is_empty = 1, i = 1; for(int j = strlen(t.temp)-1;j>=i;j--) { if(('0'<= t.temp[j]) && (t.temp[j] <= '9')) { t.ans+=base*(t.temp[j] - 48); base*=10; } else { t.is_empty = 1; break; } } if(t.ans > 1000 || t.ans <=0) t.is_empty = 1; }
第三步:将一个大数组进行临时存储所有字符,然后循环扫第一个空格,这里千万不能拆成两个输入,不然A无法获取为空值,就会过不了其中一个测试点。
char temp[999999]; int up; int have = 0; cin.getline(temp,999999); for(int i = 0;;i++) { if(temp[i] == ' ' && have == 0) { up = i; have = 1; continue; } if(i>=strlen(temp)) break; if(have == 0) temp_1.temp[i] = temp[i]; else temp_2.temp[i-up-1] = temp[i]; }
第四步,调用结构体处理函数:
TempToAns(temp_1);
TempToAns(temp_2);
第五步:进行输出,通过判断temp_1(或temp_2).is_empty是否为1来判断是否输出?
if(temp_1.is_empty == 1) printf("?"); else { if(temp_1.ans == 0) { temp_1.is_empty = 1; printf("?"); } else printf("%d",temp_1.ans); } printf(" + "); if(temp_2.is_empty == 1) printf("?"); else printf("%d",temp_2.ans); printf(" = "); if(temp_1.is_empty == 0 && temp_2.is_empty == 0) printf("%d\n",temp_1.ans+temp_2.ans); else printf("?\n");
· AC代码:
#include<stdio.h> #include<iostream> #include<string.h> #include<cstring> using namespace std; struct T{ char temp[9999999]; int is_empty = 0; int ans = 0; }temp_1,temp_2; char temp; int base; void TempToAns(struct T &t) { int i = 0; t.ans = 0; base = 1; if(t.temp[0] == 45) t.is_empty = 1,i = 1; if(t.temp[0] == 32 ) t.is_empty = 1, i = 1; for(int j = strlen(t.temp)-1;j>=i;j--) { if(('0'<= t.temp[j]) && (t.temp[j] <= '9')) { t.ans+=base*(t.temp[j] - 48); base*=10; } else { t.is_empty = 1; break; } } if(t.ans > 1000 || t.ans <=0) t.is_empty = 1; } int main() { char temp[999999]; int up; int have = 0; cin.getline(temp,999999); for(int i = 0;;i++) { if(temp[i] == ' ' && have == 0) { up = i; have = 1; continue; } if(i>=strlen(temp)) break; if(have == 0) temp_1.temp[i] = temp[i]; else temp_2.temp[i-up-1] = temp[i]; } TempToAns(temp_1); TempToAns(temp_2); if(temp_1.is_empty == 1) printf("?"); else { if(temp_1.ans == 0) { temp_1.is_empty = 1; printf("?"); } else printf("%d",temp_1.ans); } printf(" + "); if(temp_2.is_empty == 1) printf("?"); else printf("%d",temp_2.ans); printf(" = "); if(temp_1.is_empty == 0 && temp_2.is_empty == 0) printf("%d\n",temp_1.ans+temp_2.ans); else printf("?\n"); return 0; }
------------------------------------------------L1-026----------------------------------------------------------
I Love GPLT
这道超级简单的题目没有任何输入。
你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。
所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
输入样例:
无
输出样例:
I
L
o
v
e
G
P
L
T
注意:输出的两个空行中各有一个空格。
------------------------------------------------L1-026----------------------------------------------------------
注解 :水题,不知道意义在哪
#include<stdio.h> #include<string.h> char N[]={"I Love GPLT"}; int main() { for(int i = 0;i<11;i++) printf("%c\n",N[i]); return 0; }
注:如果有更好的解法,真心希望您能够评论留言贴上您的代码呢~互相帮助互相鼓励才能成长鸭~~