几乎一样的思路为什么我超时了?简单ACM题求看
///////////////////////////以下是题目要求
Sample Input
1
3
I am happy today
To be or not to be
I want to win the practice contest
Sample Output
I ma yppah yadot
oT eb ro ton ot eb
I tnaw ot niw eht ecitcarp tsetnoc
首先是我的代码:
- C/C++ code
#include<stdio.h>#include<string.h>#define MAX 1000int main(){ int cases,n; scanf("%d%d",&cases,&n); getchar(); //不加参数则等价于cin.ignore(1,EOF);忽略结尾前的1个字符cin.ignore(1024,\n)也常用 char str[MAX]; char token[MAX]; int i,j,k; while(cases--){ while(n--){ gets(str); int len=strlen(str); k=0; for(i=0;i<=len;i++){ //此处要去=len否则没有检查最后个单词后是否为空格就结束最后个单词没法输出 if(str[i]!=' '&&str[i]!=0){ //遇到空格说明一个单词结束进行反向输出,遇到回车表示一行结束 token[k++]=str[i]; } else{ for(j=k-1;j>=0;j--) printf("%c",token[j]); if(str[i]!=0) printf(" "); //若是结尾则不需要再输入空格了 k=0; } } printf("\n"); //一行单词结束换行 } if(cases!=0) printf("\n"); } return 0;}然后是正确的代码
- C/C++ code
#include<iostream>#include<string.h>#include<stdio.h>using namespace std;int main(){ char s[1000]; char s1[1000]; int cases; int num; int i , k ,j ; scanf("%d",&cases ); while(cases --) { scanf("%d",&num) ; gets(s); //关键的一行语句,获取scanf输入后面的换行; 否则就当是一次输入处理 while(num--) { gets(s); int len =strlen(s); k=0; for(i =0; i <= len; i++) { if(s[i]!=' ' && s[i]!='\0') s1[k++] =s[i]; else { for ( j=k-1; j>=0; j--) printf("%c",s1[j]); if(s[i] ==' ') printf(" "); k=0; } } printf("\n"); } if(cases >0) printf("\n"); } return 0;}郁闷死了 你们给我看看 到底是哪里不一样了 我看了遍 就是scanf输入的2个位置不同
顺便说明下cases代表测试组数 n表示英文的行数
还有题目是ZOJ1151
[解决办法]
getchar(); 去掉,我猜是这个有问题
[解决办法]
2个scanf()位置不同,应该逻辑上差异很大了,下面的scanf()是每次外层循环都调用一次,而上面那个是总共只调用一次.
没完整的看代码,判断可能存在偏差,供参考.