10/25 Java プログラミング入門(3)


前回までの補足


前回の課題について

10/18 課題

インド出身の天才数学者ラマヌジャンについて以下のようなエピソードが知 られている. 数学者ハーディがたまたま拾ったタクシーのナンバーが XXXX (4桁の数)とい うものだった.彼がその数のことをラマヌジャンに面白くない数だと行ったと ころ,ラマヌジャンは即座に,「その数は大変面白い数で,2つの3乗数の和で 2通りに表される最小の数だ」と答えた. 問題 10000以下で2つの3乗数の和で2通りに表される数をすべて求めるプログラム を書きなさい.ファイルは,自分のホームディレクトリの下に java というディレクトリを作成して,その下にKadai1018.java という名前で作成する(クラス名もKadai1018という名前で作成する).
解答例(1)
class Kadai1018{
  public static void main(String[] args){
    int count,a,i,j,n=30;
    for(a=0;a<=10000;a++){
      count=0;
      for(i=1;i<=n;i++)
        for(j=i;j<=n;j++)
          if(a==i*i*i+j*j*j)
            count++;
      if(count==2)
        System.out.println(a);
    }
  }
}

解答例(2) -- 不要なセミコロン「;」は赤で示す.
class Kadai1018{
  public static void main(String[] args){
    int check[]=new int[10000+1];
    for(int i=1;i<=10000;i++){
      check[i]=0;
    };
    for(int i=1;(i*i*i)<=10000;i++){
      for(int j=1;j<=i;j++){
        int k=(i*i*i)+(j*j*j);
        if(k<=10000){
          check[k]++;
        };
      };
    };
    for(int i=1;i<=10000;i++){
      if (check[i]>=2){
        System.out.println(i);
      };
    };
  }
}

解答例(3)
//学生証番号XXXXXX
//XXXXXX
//はっきり言って力業です。遅いけれどもゴリ押しで何とかできます。
class Kadai1018{
  public static void main(String[] args){
    int a,b,c,d,n;
    for(n=1;n< 10000;n++)
    for(a=1;a< Math.pow(n,1.0/3.0);a++)
        for(b=a;b< Math.pow(n,1.0/3.0);b++)
          if(a*a*a+b*b*b==n) // (a)
          for(c=1;c!=a;c++)
            for(d=c;d< Math.pow(n,1.0/3.0);d++)
              // (b)
                if(n==c*c*c+d*d*d){
        System.out.println(n +"="+ a +"*"+ a +"*"+ a +"+"+ b +"*"+ b +"*"+ b
                           +"="+ c +"*"+ c +"*"+ c +"+"+ d +"*"+ d +"*"+ d );
              }
  }
}

講評

問題が,3通りに表せる場合に認めるか曖昧だったので,どちらと解釈したプ ログラムも正解とした.ただし,10000までではどちらも答えは同じで,
1729 = 13+123 = 93 + 103
4104 = 23+163 = 93 + 153
の2つ(どのように分解されるかを表示しなくても正解とした).タクシーのナ ンバーは1729だったと分かる.全員が正しい答えを出している.

想定した解答は解答(1)のようなプログラムだが,効率は余り良くない (223 = 10648なのでnは21でも良い).解答(2)は配列(今回やる)を 使っているので前回までの範囲は超えているが,実行速度は100倍位速い.

解答(3)は解答(1)を4重のループにして,変数countを使わないようにしたも ので,実行はほとんど変らないがこちらのプログラムの方が理解しやすい人も いるかもしれない.途中までは,(a)の行が(b)の位置に入っていたため,100 倍以上遅いプログラムになっていた.


今日の課題

上のURLは,今日(10/25)の17:00 までは
Forbidden

You don't have permission to access /~ktanaka/programming00/kadai1025.html on this server.
とうメッセージが出てアクセ スできないはずである.17:00以降にも同様のエラーが出る時は,Shiftキーを 押しながら,再読み込み(Reload)を押してみること.
次へ進む