【問題の説明】
既知のcosxのおおよその計算式は次のとおりです。
cosx = 1-x2 / 2!+ x4 / 4!--x6 / 6!+…+(-1)nx2n /(2n)!
ここで、xはラジアン、nは0以上の整数です。上記の近似計算式を使用して、ユーザーが入力したxとnの値に応じてcosxの近似値を計算するプログラムを作成し、出力結果の小数点以下8桁を要求します。
【入力フォーム】
コンソールから10進数のx(0 <= x <= 10)と整数のn(0 <= n <= 1000)を、2つの数値の間のスペースで区切って入力します。
【出力フォーム】
コンソール出力式の結果:小数点以下8桁。
【サンプル入力1】
1.0472 3
【サンプル出力1】
0.49996244
【サンプル入力2】
1.0472 49
【サンプル出力2】
0.49999788
[サンプル概要]
xを1.0472、nを3と入力すると、cosxの近似式の値は0.49996244で、小数点以下8桁になります。同様に、xが1.0472、nが49の場合、cosxの近似式の値は0.49999788です。 、小数点以下。8ビットは予約されています。
注:データの正確性と一貫性を確保するために、doubleデータ型を使用して計算結果を保存してください。
【採点】
この質問には、上記の式の計算結果、合計5つのテストポイント、各テストポイント5ポイント、合計25ポイントの出力が必要です。
最初の間違った書き込み:
package pkg3;
import java.util.Scanner;
public class Demo03 {
public static void main(String[] args) {
double x=0.0,sum=1.0;
int n;
Scanner sc1 = new Scanner(System.in);
x = sc1.nextDouble();
n = sc1.nextInt();
sc1.close();
int sign;
double temp;
long down;
for (int i = 1; i <= n; i++) {
sign = i%2==1?-1:1;
temp = Math.pow(x, 2*i);
down = 1;
for (int j = 1; j <= 2*i; j++) {
down *= j;
}
System.out.println(sign+" "+down);
sum += sign*temp/(double)down;
}
System.out.println(String.format("%.8f", sum));
}
}
だから、ギャングの問題解決によって書かれたブログへのインターネットこれは、
制御階乗(2n!)で問題を見つけたリンクです。最大20を節約するために!、最大16を節約するためにInt !、だからダイレクトライン階乗どこにもありません。
その後、改善されました:
package pkg3;
import java.util.Scanner;
public class Demo03 {
public static void main(String[] args) {
double x=0.0,sum=1.0;
int n;
Scanner sc1 = new Scanner(System.in);
x = sc1.nextDouble();
n = sc1.nextInt();
sc1.close();
double temp=1; // 第i项绝对值
for (int i = 1; i <= n; i++) {
temp = (-1)*temp*x*x/(2*i*(2*i-1));
sum += temp;
}
// System.out.printf("%.8f", sum);
System.out.println(String.format("%.8f", sum));
}
}
分析とまとめ:凝視法では、隣接するアイテムの絶対値がx * x /(2i(2 i-1))倍異なることがわかります。したがって、毎回乗算を行い、計算されたデータを再利用します。