Math.java:3: メソッド sqrt(int) を class Math 中で発見できませんでした。 Math.sqrt(i);のようなエラーが出ました.
解答例
class Kadai1020{ public static void main(String[] args){ // 平方根の逆数の和を保持する変数 sum をdouble型で宣言し,0.0を入れる. double sum=0.0; // 繰り返し文を制御する int 型の変数 i を宣言する. int i; // 後でプログラムを変更しやすいように変数で宣言しておく int n=100; // nまで繰り返すので,繰り返しの条件は i<=nとなる. // i++ は i=i+1の意味 for(i=1;i<=n;i++) // 下の式は sum+=1.0/Math.sqrt(i); と書くこともできる. sum=sum+1.0/Math.sqrt(i); // 結果を表示する System.out.println(sum); } } ktanaka@ux019> java Kadai1020 18.58960382478415ここで,
int n=100;の行を
int n=1000;変更することにより,1から1000までに変更することができる.1000000まで 求めると
n=100 18.58960382478415 n=1000 61.80100876524318 n=10000 198.54464544952413 n=100000 630.9967586623756 n=1000000 1998.540145491202となる.この数を眺めて,収束しそうにないという結論を出すだけで正解 である.
センスのある人は,この数字を見て nを10倍にすると,和は約3倍になってい るとか,和が√nに比例している(実際,積分して近似するとわかるが問題の式 は2√nで近似できる)ということにも気づくと思うが,そこまでは求めない.
解答者の中には,nを変更するたびにプログラムを変更してコンパイルし直す 手間を省くために,nを10倍づつ変化させる2重の for ループにした人もいた. その場合の解答例を書く.
class Kadai1020{ public static void main(String[] args){ double sum; int i; int n; // nは10倍づつ変化させて1000000まで計算する. // 繰り返しの中に複数の文を含むので「{」を入れる. for(n=100;n<=1000000;n=n*10){ // 毎回1からの和を計算し直すので,sumの値はここで0.0にする sum=0.0; for(i=1;i<=n;i++) sum=sum+1.0/Math.sqrt(i); System.out.println("n="+n+",sum="+sum); } } }解答の中には,
sum=0.0;を外側の for 文
for(n=100;n<=1000000;n=n*10){の前に入れたために,和が正しく計算出来ていないものがあった.
1000000では不足だと更に大きな値で試した人もいると思うが,nの値を10倍に すると,実行時間もほぼ10倍になるのでなかなか終わらない.