作者bleed1979 (十三)
看板C_and_CPP
標題Re: [問題] 關於一個ZeroJudge的程式設計問題
時間Fri Feb 21 08:40:39 2014
這邊也好久沒人問解題的問題了,讓我來懷舊一下(雷)。
首先分析題目。
第一行是給定字串,也就是gets(code);的地方。
以12233445來說,
出現1就替換成2,2替換成3,這個trick原po已有解了。
這是一個初學的題目,且假定題目出題正確。
在ASCII code又可見字元不重複的情況下,
就算是因為替換而將code乘以兩倍,
長度也不會超過1000。
所以,char code[1000] = {};都會過。
可能原po會納悶:設10000都不過了,設1000會過?!
是的,在改進一些小問題後是會過的。
code的改法直接在以下原文修改。
以及點出回車問題的產生地點。
※ 引述《snoopy0907 ()》之銘言:
: 開發平台 windows8 + mingw + notepad++
: 開發語言 純C
: 問題出處 http://140.122.185.166/ZeroJudge/ShowProblem?problemid=a100
: 問題:其實自己餵一些簡單輸入都會正確,但是一直不給過,不太知道原因
: 但是我發現用一行有上萬個英文字母的測資時,似乎無法一次全部getchar進來
: 很固定在四千九百多的字元後,getchar似乎就沒再讀進來了,我在想是不是
: 輸入流的緩衝區大小有限制的關係,可是如果真的是這樣,
: 我不太清楚下一步要怎麼處理了~不知道有沒有前輩可以指點一下呢?
: 謝謝~
: 程式碼不長,我的Code如下
: #include<stdio.h>
: #include<string.h>
: int main()
: {
: int num;
: int temp;
: int count, i, j, k;
: char code[10000] = {};
可以改成 char code[1000] = {};確切測資有多長我不知道。
: char decode;
: scanf("%d", &num);
^^^^^^^^^^^^^^^^^^^^^^^
: rewind(stdin);
: for( i = 0; i < num; i++ ){
: gets(code);
^^^^^^^^^^^^^
兩行標記處就是產生回車問題的地方。
這是大陸用語,其解釋請參考wiki或google之。
所以在scanf("%d", &num);之後的rewind該行
替換成簡單的getchar();就可以避免。
: count = strlen(code);
: for( j = 0; j < 4; j++ ){
: while( ( decode = getchar() ) != '\n' ){
: temp = decode;
: for( k = 0; k < count; k+=2 ){
: if( decode == code[k] ){
: if( ( k % 2 ) == 0 ) {
OOOOOOOOOOOOOOOOOOOOO
: temp = code[k+1];
OOOOOOOOOOOOOOOOOOO
k有可能mod 2不等於0嗎?應該是不會啦,if該行拿掉。
另外,你應該在temp = code[k + 1];比對成功後break;掉for迴圈。
: }
: }
: }
: printf("%c", temp);
: }
: printf("\n");
: }
: printf("\n");
XXXXXXXXXXXXXXXX
題目separate空白行是指兩組答案"之間"空白,
目前寫法是每組答案都空一行,鐵定錯!
可以包在
if(i != num - 1) {
}
之中就會對了。
: }
: return 0;
: }
以上。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.63.96.2
推 snoopy0907:謝謝~其實我只把rewind換成getchar就過了~感激 02/21 10:03
→ snoopy0907:沒遇過回車問題,來研究一下~ 02/21 10:04