2011年8月19日 星期五

d507: 三角形的判斷

內容 :
    給你一個三角形的邊長,請你判斷它是銳角 (acute)、直角 (right)、或是鈍角 (obtuse) 三角形。

輸入說明 :
    輸入只有一行,含有三個由空白隔開的正整數 a, b, c (0 < a, b, c ≤ 46340),代表三角形的邊長。

輸出說明 :
    依三角形的類別輸出「acute triangle」、「right triangle」、或「obtuse triangle」。

範例輸入 :
3 4 5

範例輸出 :
right triangle

程式碼 :
#include <stdio.h>
int main() 
{
    int a,b,c;
    
    while(scanf("%d%d%d",&a,&b,&c)==3)
    {
        if(a > c)
            a^=c^=a^=c;
        if(b > c)
            b^=c^=b^=c;
        a = a * a;
        b = b * b;
        c = c * c;
        if((a+b) == c)
            printf("right triangle\n");
        else if((a+b) < c)
            printf("obtuse triangle\n");
        else
            printf("acute triangle\n");        
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d507

2 則留言:

  1. if(a > c)
    09.
    a^=c^=a^=c;
    10.
    if(b > c)
    11.
    b^=c^=b^=c;
    這是什麼意思??

    回覆刪除
  2. a^=c^=a^=c; <= 是交換a和c的內容
    如果寫成以下的方式會比較好理解
    temp = a;
    a = c;
    c = temp;

    ------------------------------------------
    第9行交換的過程如下(a^=c^=a^=c; 從右至左拆解!!)
    a = a ^ c;
    c = c ^ a;
    a = a ^ c;

    今天我們假設a=3 c=5 轉成2進位 a=011 c=101 套入上面那三行
    a = a ^ c;
    110 = 011 ^ 101;

    c = c ^ a;
    011 = 101 ^ 110;

    a = a ^ c;
    101 = 110 ^ 011;

    所以 a=101 c=011 轉成十進位 a=5 c=3
    所以只用這一行就可以把a和c的值互相轉換!!!

    回覆刪除