問題006(7点)

祖母が天秤を使っています。
天秤は、二つの皿の両方に同じ目方のものを載せると釣合い、そうでない場合には、重い方に傾きます。
10 個の分銅の重さは、軽い順に1g,2g,4g,8g,16g,32g,64g,128g,256g,512gです。
祖母は、「1kg くらいまでグラム単位で量れるのよ。」と言います。
「じゃあ、試しに、ここにあるジュースの重さを量ってよ」と言ってみると、祖母は左の皿にジュースを、右の皿に8g と64g と128g の分銅を載せて釣合わせてから、「分銅の目方の合計は200g だから、ジュースの目方は200g ね。どう、正しいでしょう?」と答えました。
左の皿に載せる品物の重さを与えるので、天秤で与えられた重みの品物と釣合わせるときに、右の皿に載せる分銅を軽い順に空白で区切って出力して終了するプログラムを作成して下さい。
ただし、量るべき品物の重さは、すべての分銅の重さの合計(=1023g) よりは小さいものとします。

■ヒント:分銅の重さは2n(n=0,1,...,9)gです。

入力

左の皿に載せる品物の重さ(正の整数)

出力

右の皿に載せる分銅(昇順)空白区切り

入力例1

5

出力例1

1 4

入力例2

7

出力例2

1 2 4

入力例3

127

出力例3

1 2 4 8 16 32 64

考え方

まず、分銅の重さを配列として用意しましょう。
そして、ループで重い方から調べていきます。

たとえば、調べる重さxが513gなら、まず一番重い分銅の512gと比べます。
xの方が大きい(か等しい)ので512gの分銅は使います。
そして、xから512を引きます。これでxは1です。
つぎに、256gとx(=1)を比べます。
分銅の方が大きいので256gは使いません。

このようにして、128,64,32,16,8,4,2,1と重い順に調べます。
最後に1を使うことが分かります。
つかうのは、1gと256gです。

ただし、使うと分かった時点で出力すると降順になってしまうので、多少工夫が必要です。
各自、考えてください(オィ)。



//
//A006.java
//

import java.io.*;

public class A006{
    //分銅
    private static final int[] weit={1,2,4,8,16,32,64,128,256,512};
    //分銅を使うか(上と添え字が一致)(初期値はfalse)
    private static boolean[] use=new boolean[10];

    public static void main(String[] args)throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        //データ入力
        int data=Integer.parseInt(br.readLine());
        //分銅の重い方から調べる
        for(int i=0;i<weit.length;i++){
            //残りの重さが今回の以上だったら
            if(data>=weit[weit.length-1-i]){
                //残りの重さから今回の重さを引く
                data-=weit[weit.length-1-i];
                //使ったフラグ設定
                use[weit.length-1-i]=true;
            }
        }
        //使ったかを調べていく
        for(int i=0;i<use.length;i++){
            //使われていたら
            if(use[i]){
                //重さを出力(複数ある時のために半角スペースをつける)
                System.out.print(weit[i]+" ");
            }
        }
    }
}


正しくゲームをするページ>パソコン甲子園攻略>ココ