Дано действительное число а(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 итераций, так что я, пожалуй, несколько забежал вперед :)

→ Ссылка