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倍になるのでなかなか終わらない.