Дано действительное число а(1<а<3) .Составить алгоритм, находящий среди чисел 1 , 1+1/2 , 1+1/2+1/3 , ... первое, большее а
Язык C. Не могу найти ошибку.
#include<stdio.h>
#include<math.h>
#include<locale.h>
void main()
{
setlocale(LC_ALL, "russian");
float a, s=0;
int i = 1;
printf("Введите число больше 1 и меньше 3\n");
scanf_s("%f", &a);
if (a > 3 && a < 1) {
printf("Ошибка!");
}
else {
while (s <= a)
{
s = s + (1 / i);
i++;
}
printf("%f\n", s);
}
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Ваша самая большая ошибка - целочисленное деление
1 / i
каковое дает при i>1 результат 0. Запишите деление как
s += 1.0/i
Только вот все равно ваша программа будет при реально больших числах работать неимоверно долго. Например, для 12 нужно 100000 итераций :( Да и точности float может не хватить.
Так что я бы изменил сам алгоритм - для чисел до 5-10 еще считал бы ряд, а для больших - использовал бы асимптотическое приближение гармонического числа.
Впрочем, для a < 3 достаточно 11 итераций, так что я, пожалуй, несколько забежал вперед :)