Вычисление корня n степени из положительного числа последовательными приближениями - C (СИ)
Формулировка задачи:
Помогите написать программу на Си для вычисления корня n-степени из положительного числа а, пользуясь последовательными приближениями
xk+1 =(n-1)*xk/n+a/(n*xn-1k)
k = 0, 1, 2, ... до совпадения соседних приближений с точностью eps, если задано начальное приближение x0.
Примечание: масиивы использовать нельзя, по условию.
Решение задачи: «Вычисление корня n степени из положительного числа последовательными приближениями»
textual
Листинг программы
#include <stdio.h>
#include <locale.h>
#include <math.h>
int main(void)
{
double x, eps;
double n;
double y1, y2;
short k;
char line[100];
if (setlocale(LC_ALL, "C") == NULL)
fprintf(stderr, "Failed to set locale!\n");
printf("Программа извлекает корень n-ой степени из заданного\n"
"положительного числа, используя рекурентное соотношение:\n"
"Yi+1 = Yi + 1 / n * (x / (Yi ^ (n - 1)) - Yi)\n");
fflush(stdout);
do {
do {
printf("Задайте x > 0 ");
fflush(stdout);
} while (fgets(line, sizeof line, stdin) == NULL
|| sscanf(line, "%lf", &x) != 1
|| x <= 0);
do {
printf("Задайте n > 1 ");
fflush(stdout);
} while (fgets(line, sizeof line, stdin) == NULL
|| sscanf(line, "%lf", &n) != 1
|| n <= 1 || (unsigned long) n != n);
do {
printf("Введите точность >0 и <1 ");
fflush(stdout);
} while (fgets(line, sizeof line, stdin) == NULL
|| sscanf(line, "%lf", &eps) != 1
|| eps <= 0 || eps >= 1);
y2 = 1;
if (y2) {
do {
y1 = y2;
y2 = y1 + (x / pow(y1, n - 1) - y1) / n;
} while (fabs(y2 - y1) >= eps);
}
for (k = 0; eps < 1; eps *= 10, k++)
;
printf("Вычисленное значение корня %.*f\n", k, y2);
printf("Контрольное значение %f\n", pow(x, 1.0 / n));
} while (getchar() != EOF);
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Устанавливается локальная настройка для русского языка
- Выводится инструкция для ввода данных
- Проверка ввода: число x (условия: x > 0)
- Проверка ввода: число n (условия: n > 1)
- Проверка ввода: точность eps (условия: 0 < eps < 1)
- Инициализация начального приближения y2 со значением 1
- Цикл: пока разница между текущим и предыдущим приближением больше заданной точности eps
- Внутри цикла: вычисление нового приближения y2 по формуле рекурентного соотношения
- Цикл: пока разница между вычисленным значением корня и контрольным значением больше заданной точности eps
- Внутри цикла: уменьшение точности eps в 10 раз и увеличение числа k на единицу
- Вывод результатов: вычисленное значение корня и контрольное значение
- Проверка на конец ввода/вывода: если нажата клавиша EOF, то программа завершается
- Возврат 0, что означает успешное выполнение программы