#5140: 不明白Wa出現的原因


s90304a123 (周芷若)

學校 : 國立澎湖科技大學
編號 : 15804
來源 : [1.172.12.5]
最後登入時間 :
2012-09-24 02:38:12
d980. 11479 - Is this the easiest problem? -- UVa11479 | From: [220.142.198.42] | 發表日期 : 2011-05-29 00:55

    
    
    #include<stdio.h>
 
    int main(void)
    {
    
        int t,q;
        float side1[30],side2[30],side3[30],maxmumside;

        scanf("%d",&t);
        
        for(q=0; q<t; q++)
        {
                 scanf("%f %f %f",&side1[q],&side2[q],&side3[q]);
                 }
        
        for(q=0; q<t; q++)
        {
                 if(side1[q]==side2[q]==side3[q]){printf("Case %d: Equilateral\n",q+1); continue;}
                 
                 if(side1[q]>side2[q]&&side1[q]>side3[q]){maxmumside=side1[q]; if(side2[q]+side3[q]<maxmumside){printf("Case %d: Invalid\n",q+1);continue;}}
                 if(side2[q]>side1[q]&&side2[q]>side3[q]){maxmumside=side2[q]; if(side1[q]+side3[q]<maxmumside){printf("Case %d: Invalid\n",q+1);continue;}}
                 if(side3[q]>side2[q]&&side3[q]>side1[q]){maxmumside=side3[q]; if(side2[q]+side1[q]<maxmumside){printf("Case %d: Invalid\n",q+1);continue;}}
                 
                 
                 
                 if(side1[q]==side2[q] || side1[q]==side3[q] || side3[q]==side2[q]) {printf("Case %d: Isosceles\n",q+1);}
                 else{
                 if(side1[q]!=side2[q] && side1[q]!=side3[q] && side3[q]!=side2[q]) {printf("Case %d: Scalene\n",q+1);}}
        }

    return 0;
    }
 
總是會把Scalene判斷成Isosceles 
與正確輸出不相符(line:5)
您的答案為: Case 5: Isosceles
正確答案為: Case 5: Scalene
 
可是明明輸入資料是三邊不等長,那我的程式碼到底是怎麼把他判斷成有兩個一樣長的呢?= =?
 
#5178: Re:不明白Wa出現的原因


longbiau ((~o ̄▽ ̄)o Summer)

學校 : 臺北市立中正高級中學
編號 : 8414
來源 : [203.64.138.253]
最後登入時間 :
2013-02-27 15:34:10
d980. 11479 - Is this the easiest problem? -- UVa11479 | From: [61.231.71.252] | 發表日期 : 2011-06-11 16:00

  1. 判斷正三角形的地方有些瑕疵:side1[q]==side2[q]==side3[q]
    假如第二條和第三條邊等長,會被當作side1[q]==(true)看待,而C語言會在這裡將true當成1。因此除非這個三角形的邊長都是1,不然無論如何都輸出不了Equilateral。
  2. 判斷Invalid的三角不等式有漏洞。
  3. 由於題意已表明輸入必為32位元有號整數,且這裡也沒必要刻意用浮點數去處理,因此請用整數型別,如此可以避免誤差困擾。而且就算要用浮點數,我也建議用高精度double配%lf,畢竟解題時的記憶體限制是比較無關緊要的。

而你所提的問題,在於第五筆測資2147483647 2 2147483646存進去float陣列後,變成了2147483648.0 2.0 2147483648.0,因此輸出才會出乎意料。

 
ZeroJudge Forum