Copyright (C) IOI日本委員会 1996. All rights reserved.


問題6.

 3辺の長さが有理数で、面積がある自然数 S になっている直角三角形の斜辺を求めたい。

 (1) 三角形の斜辺の長さをcとしたとき、他の2辺の長さをSとcの式で表せ。[1点]
 (2) 下記のプログラムは、面積Sを入力すると、斜辺の長さを分数の形で出力する。
ただし、解がない場合は停止しない。空欄に式を入れて、プログラムを完成させよ。[1点]


QuickBASICプログラム(6)

DEFLNG A-Z
CONST false = 0, true = -1
DECLARE FUNCTION isSquare (x AS LONG)
' c = q/p, w = p+q

    PRINT "面積を入力してください。": INPUT S

    w = 1
    WHILE true
        w = w + 1
        FOR p = 1 TO w - 1
            q = w - p
                   ---------------------
            sqr1 =|       (a)         |
                   ---------------------
                   ---------------------
            sqr2 =|       (b)         |
                   ---------------------
            IF isSquare(sqr1) AND isSquare(sqr2) THEN
                PRINT "斜辺="; q; "/"; p: END
            END IF
        NEXT p
    WEND
END

FUNCTION isSquare (x AS LONG)  ' 平方数の判定
    IF x < 0 THEN
        isSquare = false: EXIT FUNCTION
    ELSE
        y = INT(SQR(x) + .5): isSquare = (x = y * y)
    END IF
END FUNCTION


Cプログラム(6)

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define FALSE 0
#define TRUE  1

int is_square(long x)  /* 平方数の判定 */
{
    long y;

    if (x<0) return FALSE; 
    else {
        y = floor(sqrt(x)+0.5);
        return (x==y*y);
    }
}

void main()
{ 
    int  S;
    long p,q,w,sqr1,sqr2;  /* c=q/p, w=p+q */

    printf("面積を入力して下さい。\n"); scanf("%d", &S);

    w = 1;
    while (TRUE) {
        ++w;
        for (p=1; p<w; p++) {
            q = w-p;
                   ---------------------
            sqr1 =|       (a)         |;
                   ---------------------
                   ---------------------
            sqr2 =|       (b)         |;
                   ---------------------
            if (is_square(sqr1) && is_square(sqr2)) {
                printf("斜辺=%ld/%ld\n", q,p); exit(0);
            }
        }
    }
 }


Pascalプログラム(6)

program problem6;
var S:integer;
    p,q,w,sqr1,sqr2:longint;  {c=q/p, w=p+q}

    function is_square(x:longint):boolean;  {平方数の判定}
    var y:longint;
    begin 
        if x<0 then is_square := false 
        else begin
            y := round(sqrt(x)); is_square := (x=y*y)
        end
    end; {is_square}

begin
    writeln('面積を入力して下さい。'); readln(S);

    w := 1;
    while true do begin
        w := w+1;
        for p:=1 to w-1 do begin
            q := w-p;
                    ---------------------
            sqr1 :=|       (a)         |;
                    ---------------------
                    ---------------------
            sqr2 :=|       (b)         |;
                    ---------------------
            if is_square(sqr1) and is_square(sqr2) then begin
                writeln('斜辺=',q,'/',p); exit
            end
        end
    end
end.


JOI'96へ戻る

JOIホームページへ戻る