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


問題4.

 自然数を、連続する 2 個以上の自然数の和で表したい。
ただし、解(このような表し方)がない場合もある。

 (1) 下記のプログラムは、自然数を入力すると、解がある場合はその最初と最後の数を出力する。 空欄に式を入れて、プログラムを完成させよ。 [1点]
 (2) 解が存在しないのは、どのような自然数の場合か? [1点]


QuickBASICプログラム(4)

DEFINT A-Z

    PRINT "自然数を入力してください。": INPUT a

    k = 1
    WHILE a MOD 2 = 0
        a = a / 2
        k = 2 * k
    WEND
              ----------------------
    startNo =|       (a)          |
              ----------------------
            ----------------------
    endNo =|        (b)         |
            ----------------------
    IF startNo <= 0 THEN startNo = 1 - startNo

    PRINT startNo, " から ", endNo, " までの和である。"
END


Cプログラム(4)

#include <stdio.h>

void main()
{
    int a,k,start_No,end_No;
  
    printf("自然数を入力して下さい。\n"); scanf("%d", &a);

    printf("%d は ", a);
    for (k = 1; a%2 == 0; k *= 2) a /= 2;
               ----------------------
    start_No =|       (a)          |;
               ----------------------
             ----------------------
    end_No =|        (b)         |;
             ----------------------
    if (start_No<=0) start_No = 1-start_No;

    printf("%d から %d までの和である。\n", start_No,end_No);
}


Pascalプログラム(4)

program problem4;
var a,k,start_No,end_No:integer;
begin
    writeln('自然数を入力して下さい。'); readln(a);

    write(a,' は ');
    k := 1;
    while (a mod 2)=0 do begin
        a := a div 2; k := 2*k
    end;
                ----------------------
    start_No :=|       (a)          |;
                ----------------------
              ----------------------
    end_No :=|       (b)          |;
              ----------------------
    if start_No<=0 then start_No := 1-start_No;

    writeln(start_No,' から ',end_No,' までの和である。')
end.


JOI'96へ戻る

JOIホームページへ戻る