【문제 설명】
알려진 cosx의 대략적인 계산 공식은 다음과 같습니다.
cosx = 1-x2 / 2! + x4 / 4! -6 개 / 6 개! +… + (-1) nx2n / (2n)!
여기서 x는 라디안이고 n은 0보다 크거나 같은 정수입니다. 위의 근사 계산식을 이용하여 사용자가 입력 한 x와 n의 값에 따라 cosx의 근사값을 계산하는 프로그램을 작성하고, 출력 결과 소수점 뒤에 8 자리가 필요합니다.
[입력 양식]
콘솔에서 10 진수 x (0 <= x <= 10)와 정수 n (0 <= n <= 1000)을 두 숫자 사이에 공백으로 구분하여 입력합니다.
【출력 형식】
콘솔 출력 공식 결과 : 소수점 이하 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 비트가 예약되어 있습니다.
참고 : 데이터의 정확성과 일관성을 보장하려면 이중 데이터 유형을 사용하여 계산 결과를 저장하십시오.
【등급】
이 질문은 위 공식의 계산 결과, 총 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 개까지 저장합니다! , 그래서 직접 라인은 아무데도 계승 .
그런 다음 개선되었습니다.
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));
}
}
분석 및 요약 : stare 방법으로 인접 항목의 절대 값이 x * x / (2i (2 i-1)) 배 차이가 있음을 알 수 있으므로 매번 곱셈을 하고 계산 된 데이터를 재사용합니다 .