Задача. Пользуясь признаками сравнения, Даламбера или Коши, исследовать сходимость ряда: [latex]\frac{1!}{1}+\frac{2!}{2^2}+\frac{3!}{3^3}+\ldots+\frac{n!}{n^n}+\ldots[/latex]
Входные данные
[latex]n[/latex] — количество взятых членов ряда.Выходные данные
[latex]sum[/latex] — сумма.Тесты
Входные данные | Выходные данные |
1 | Сумма: 1 Числитель: 1 Знаменатель: 1 |
3 | Сумма: 1.72222 Числитель: 6 Знаменатель: 9 |
20 | Сумма: 1.87985 Числитель: 2.4329e+18 Знаменатель: 5.24288e+24 |
Код на C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> using namespace std; long double pow(long double number, unsigned int power) { long double answer = 1; for (int i = 0; i < power; i++){ answer *= number; } return answer; } int main() { long double sum = 0; unsigned int n = 0; long double numerator = 1, denominator = 1; //numerator - числитель, denominator - знаменатель, sum - сумма. cin >> n; for (unsigned int i = 1; i <= n; i++) { denominator = pow(i, i-1); sum += (1.0*numerator)/denominator; numerator*=i; } cout << "Сумма: " << sum << endl; cout << "Числитель: " << numerator << endl; cout << "Знаменатель: " << denominator << endl; return 0; } |
Код на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import java.io.PrintWriter; import java.util.Scanner; public class A { public static void main (String[] args) { Scanner in = new Scanner(System.in); PrintWriter out = new PrintWriter(System.out); double sum = 0; double numerator = 1, denominator = 1; int n = in.nextInt(); for (int i = 1; i <= n; i++) { denominator = pow(i,i-1); sum += (1.0*numerator)/denominator; numerator*=i; } System.out.println("Сумма: " + sum); System.out.println("Числитель: " + numerator); System.out.println("Знаменатель: " + denominator); } public static double pow(double number, int power) { double answer = 1; for (int i = 0; i < power; i++) { answer *= number; } return answer; } } |
Решение
Используем цикл [latex]for[/latex]: высчитываем [latex]i[/latex]-тый слагаемый, и добавляем его в сумму. В цикле высчитываем числитель, добавляем в сумму [latex]i[/latex]-тый слагаемый и домножаем числитель [latex]i[/latex]-того слагаемого на значение счётчика.
Воспользуемся веб-приложением и посчитаем сумму ряда.
Ссылки
Условие задачи (стр.251)
Решение задачи на сайте Ideone.com (C++)
Решение задачи на сайте Ideone.com (Java)
Сходимости ряда
— Пожалуйста, перечитайте внимательно свой текст после слова «Решение». Проанализируйте. Я пытался это сделать некоторое время и не нашёл в нём никакого смысла. Скорее всего с ним что-то не так.
— Вас не смущает текст, который выдает компилятор: prog.cpp:9:12: error: expected ‘;’ before ‘!’ token q=n!/n^n;
Он как бы намекает на отсутствие в С++ встроенных операторов для вычисления факториала. Нужно вспомнить (или найти в конспекте), как мы решали подобные задачи. Помните, как мы искали частное двух соседних членов ряда, «ругали» функцию pow() и т.п.?
— Вас не смущает, что программа никогда не закончит работу?
— Где тесты?
Хорошо, что Вы занялись доказательством сходимости ряда. Но я этого не требовал. Давайте я скопирую сюда условие задач этого типа, чтобы Вы не искали на сайте?
Задачи этого раздела требуют вычисления частных сумм некоторых сходящихся рядов. Сами ряды берутся из задачника Б.П.Демидовича… Вполне достаточно будет суммировать члены ряда, пока не будет достигнута заданная точность [latex]\varepsilon.[/latex] Интересно понаблюдать сколько членов ряда придётся просуммировать для достижения той или иной точности.
Для вычисления точного значения суммы ряда рекомендую воспользоваться ресурсом WolframAlpha.
Давайте, я Вам немного помогу?
Вводит некоторое число:
cin >> n;
Вычисляет числитель для n-го слагаемого
for (int i=1; i<=n; i++) { fact=fact*i; }
Вычисляет знаменатель n-го слагаемого
for (int j=1; j<=m; j++) { s=s*m; }
Зачем-то много раз вычисляет одно и тоже n-е слагаемое
for (int k=1; k<=n; k++) { q = fact/s; }
Печатает n-е слагаемое
cout << q << endl;
Спасибо за Ваше время. Буду следовать Вашему совету.
Отлично.
Вот только всё еще не работает. Слишком много ошибок. Вставьте тестовую печать и убедитесь, что слагаемые вычисляются неверно.
Пожалуйста, проверьте, учла все Ваши замечания.
Тестовую печать вставляют в середину вычислений, а не в конце. Сейчас Вы распечатали накопленную сумму, знаменатель последнего слагаемого и числитель следующего.
Я зачту работу, но приведу код, который я надеялся увидеть. он тоже не идеален, но я сделал минимум переделок в Вашем: