PAT - B1009 说反话 (20分) https://pintia.cn/problem-sets/994805260223102976/problems/994805314941992960
关键点:
- 识别输入的结束;
- 正确识别单词边界,进行分隔、存储和计数;
方法1/2 大致思路:
将输入数据按字符串看待,每个单词为一个字符串,用EOF判断输入结束;
方法1/2 通过代码(C/C++):
#include<stdio.h>
int main(){
char words[40][81]; //单词最多82/2=40个
int num=0;
while(scanf("%s", words[num])!=EOF){ // 手动输入时用[Ctrl+Z组合键 + Enter键]模拟EOF
num++;
}
for(int i=num-1;i>0;i--){
printf("%s ", words[i]);
}
printf("%s", words[0]);
return 0;
}
方法2/2 大致思路:
将输入数据按单个字符看待,用换行符\n
判断输入结束。
记录空格在整个字符串中的位置和单词数量,每两个相邻空格之间即为一个单词,输出时空格位置即每个单词的边界。
方法2/2 通过代码(C/C++):
#include<stdio.h>
int main(){
char words[81],ch;
int space[41]={-1}; //真实空格最多80/2-1=39个;整行字符串的开头(-1号位置)虚拟一个空格,末尾换行当空格看
int i=0, num=0; //i指示字符在整句中的位置;num为单词数量
ch=getchar();
while(ch!='\n'){
if(ch==' '){
space[++num]=i;
}
words[i++]=ch;
ch=getchar();
}
space[++num]=i; // 末尾换行当空格看
for(int j=space[num-1]+1;j<space[num];j++){
putchar(words[j]);
}
num--;
while(num){
putchar(' ');
for(int j=space[num-1]+1;j<space[num];j++){
putchar(words[j]);
}
num--;
}
return 0;
}