[問題] 請教高中生解題系統b077題
開發平台(Platform): (Ex: VC++, Gcc, Linux, ...)
Dev C++
額外使用到的庫(Library Used) (Ex: OpenGL, ...)
<string.h>
問題(Question):
輸出錯誤
餵入的資料(Input):
不知道
預期的正確結果(Expected Output):
Fair
錯誤結果(Wrong Output):
Unfair
程式碼(Code): (請善用置底文標色功能)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char range1[20],range2[20];
int i;
while(scanf("%s %s",&range1,&range2)!=EOF)
{
if(range1[0]=='0'&&range2[0]=='0')
break;
if(strlen(range1)>strlen(range2))
{
printf("Unfair\n");
}else if(strlen(range1)<strlen(range2))
{
printf("Fair\n");
}else
{
i=strcmp(range1,range2);
switch(i)
{
case -1:
case 0:
printf("Fair\n");
break;
case 1:
printf("Unfair\n");
}
}
}
return 0;
}
補充說明(Supplement):
http://zerojudge.tw/ShowProblem?problemid=b077
我想請問的是我這程式有哪裡邏輯錯誤嗎?
因為我在自己電腦上測試是OK的
他的範例輸入也沒問題
就是不知道為什麼丟進去的時候錯誤
另外問一下
while(scanf("%s %s",&range1,&range2)&&(range1[0]=='0'&&range2[0]=='0'))
如果這樣寫程式直接結束
請問這樣寫跟我寫在
while裡面有什麼差別嗎?
最後
請問此程式碼的寫法還有哪裡可以改善的地方嗎?
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 120.119.126.4
推
12/13 23:53, , 1F
12/13 23:53, 1F
→
12/13 23:54, , 2F
12/13 23:54, 2F
推
12/13 23:55, , 3F
12/13 23:55, 3F
推
12/14 00:14, , 4F
12/14 00:14, 4F
我改寫之後的程式如上
不過還是被賞了個WA
第一次寫我忽略了字串長度並不一定會一樣的問題
這次我是把字串長度先比較
當然比較長的那個代表數字比較大這沒問題
不過這次問題似乎是在字串相同的部份
就我認知
strcmp是比較字元在ASCII中的大小也就是順序
順序越後面的越大
所以當像這樣"694"<"65M"
在十進位代表從第一個比較到第二個時
因為'9'!='5'
而且'9'等於57
'5'等於53
所以回傳1代表"694">"65M"
相等回傳0
反之則回傳-1
是這樣沒錯吧?
我程式的想法是
當字串相等的情況下
如果S1<S2
那表示從第一個字元檢查到其中一個字元兩邊並不相等
譬如'3'跟'7'
'7'的順序比'3'後面
所以回傳-1
相等則0
最後一種情況就是S1>S2回傳1
請問以上的想法有什麼問題嗎?
※ 編輯: Mysteltainn 來自: 120.119.126.4 (12/14 00:54)
※ 編輯: Mysteltainn 來自: 120.119.126.8 (12/14 01:15)
→
12/14 07:58, , 5F
12/14 07:58, 5F
推
12/14 14:56, , 6F
12/14 14:56, 6F
→
12/14 14:57, , 7F
12/14 14:57, 7F
→
12/14 14:57, , 8F
12/14 14:57, 8F
這題終於AC了
第一次AC我並沒有使用strcmp
後來我想說實驗看看
是否strcmp回傳的值是個範圍的整數
而非只是0,1,-1
所以就寫了以下的程式
結果沒想到AC了
而且比我第一次寫的速度還快
那麼現在問題來了
請問一下我要怎麼實驗strcmp的回傳值呢?
因為我自己在電腦上試都是回傳0,-1,1
請問如果要實驗的話範例應該怎麼寫才能證明strcmp回傳的不只是0,-1,1呢?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char range1[20],range2[20];
int i;
while(scanf("%s %s",&range1,&range2)!=EOF)
{
if(range1[0]=='0'&&range2[0]=='0')
break;
if(strlen(range1)>strlen(range2))
{
printf("Unfair\n");
}else if(strlen(range1)<strlen(range2))
{
printf("Fair\n");
}else
{
i=strcmp(range1,range2);
if(i>0)
{
printf("Unfair\n");
}else
{
printf("Fair\n");
}
}
}
return 0;
}
※ 編輯: Mysteltainn 來自: 120.119.126.1 (12/14 19:43)
推
12/14 23:44, , 9F
12/14 23:44, 9F
→
12/15 00:02, , 10F
12/15 00:02, 10F
推
12/15 01:26, , 11F
12/15 01:26, 11F
→
12/15 01:26, , 12F
12/15 01:26, 12F
推
12/15 10:27, , 13F
12/15 10:27, 13F
→
12/15 10:27, , 14F
12/15 10:27, 14F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章