Задача:
Даны натуральное число [latex]n[/latex], действительное число [latex]x[/latex]. Найти:
[latex]\prod_{k=1}^{n}(\frac{k}{k+1}-cos^k|x|)[/latex]Тесты:
[latex]x[/latex] | [latex]n[/latex] | [latex]p[/latex] | Комментарий |
1 | 4 | 0.0212016 | Пройден |
-4 | 3 | -0.0779913 | Пройден |
50 | 16 | 0.0782772 | Пройден |
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <math.h> using namespace std; int main() { int n; double x, p = 1; double cs, sc; cin >> x; cin >> n; cs = cos(fabs(x)); sc = cos(fabs(x)); for(int k = 1; k <=n; k++) { p*= (k / (k + 1)) - cs; cs*=sc; } cout << p << endl; return 0; } |
Для решения данной задачи создаем цикл, счетчик [latex]k[/latex] которого не превышает заданного [latex]n[/latex]. В самом цикле вычисляем произведение [latex]p[/latex] путем домножения новых множителей заданных формулой [latex]\frac{k}{k+1}-cos^k|x|[/latex] пока [latex]k[/latex] не превысит [latex]n[/latex]. Выводим произведение [latex]p [/latex].
Код Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import java.util.*; import java.lang.*; import java.io.*; class Depo { public static void main (String[] args) throws java.lang.Exception { double n; double x, p=1; double cs, sc; Scanner in = new Scanner(System.in); x=in.nextDouble(); n=in.nextDouble(); cs= sc = Math.cos(Math.abs(x)); for(int k=1; k<=n; k++){ p*= (k / (k + 1)) - cs; cs*=sc; } System.out.println(p); } } |
Почти хорошо. Но не нужно использовать функцию возведения в степень. Нужно накапливать степень последовательными домножениями на косинус.
Исправлено
Отлично. Но в цикле постоянно вычисляется косинус модуля. Но эта величина не изменяется от шага к шагу цикла. Нужно вычислить это число один раз перед циклом и потом только домножать. Сделаете?
Зачёл.
Сделано
Хорошо. Только можно не вычислять одно и тоже два раза, а сразу присвоить обоим переменным.