Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Нахождение кол-ва вхождений числа в дробную часть


Автор: Keeper89 16.12.2012, 16:18
Доброго времени суток.

Задача следующая - посчитать, количество какой-то цифры в дробной части числа. Делаю так:
Код

#include<iostream.h>
#include<math.h>
double x;
int n, y, k;
int main()
{
  cout << "Введите вещественное число =";
  cin >> x;
  cout << "Введите цифру =";
  cin >> n;
    x-=(int)floor(x+0.5);
    k=0;
    while(x>1e-10)
    {
        x*=10;
        y=(int)floor(x+0.5);
        if(y==n)
            k++;
        x-=(int)floor(x+0.5);
    }
    cout << " Заданная цифра входит в дробную часть числа: " << k << " р.";
  
  
  return 0;
}


Все замечательно работает на числах, например 5.12312333, однако числа типа 5.7897 не работают.

Подскажите, пожалуйста, где тут косяк. Заранее спасибо.

Автор: volatile 17.12.2012, 00:45
Keeper89, задача нехороша принципиально.
Цифры хранятся в двоичной системе. Десятичные цифры, там точно не представимы.
Например 0.1 в двоичной системе это бесконечная дробь. ну и т.д. Здесь уже много раз об этом говорили.

Цитата(Keeper89 @  16.12.2012,  16:18 Найти цитируемый пост)
   while(x>1e-10)
    {
        x*=10;

здесь есть шанс вообще никогда не завершить цикл  smile 

Вашу задачу конечно можно решить, для ограниченного числа.
Скажем, для положительных, максимум 9 цифр после запятой, я бы сделал так:

Цитата(Keeper89 @  16.12.2012,  16:18 Найти цитируемый пост)
  cin >> x;
  cout << "Введите цифру =";
  cin >> n;
    x-=(int)floor(x+0.5);
    k=0;
    while(x>1e-10)
    {
        x*=10;
        y=(int)floor(x+0.5);
        if(y==n)
            k++;
        x-=(int)floor(x+0.5);
    }

  x -= floor(x);
  int y = (int) floor (x * 1000000000 +.5);
    
    k=0;
    while (y)
    {
        if (y % 10 == n)
            k++;
        y /= 10;
    }

    cout << " Заданная цифра входит в дробную часть числа: " << k << " р.";
  


Добавлено @ 00:48
Цитата(Keeper89 @  16.12.2012,  16:18 Найти цитируемый пост)
#include<iostream.h>

это еще что за анахронизм?
надеюсь не 16-разрядный компилер.
если 16-разрядный, то 
Цитата(volatile @  17.12.2012,  00:45 Найти цитируемый пост)
 intlong y = (intlong) floor (x * 1000000000L +.5);


Автор: Keeper89 17.12.2012, 11:49
volatile, спасибо! Может тогда проще перевести в строку и посимвольно посчитать, какая цифра?

Автор: bsa 17.12.2012, 11:54
Цитата(Keeper89 @  17.12.2012,  12:49 Найти цитируемый пост)
Может тогда проще перевести в строку и посимвольно посчитать, какая цифра? 

может. А если изначально вводить как строку, так и переводить не придется.  smile 

Автор: Keeper89 17.12.2012, 12:00
bsa, ну да, я имею в виду вариант работы со строкой в общем случае - не лучше?

Автор: volatile 17.12.2012, 13:55
Цитата(Keeper89 @  17.12.2012,  12:00 Найти цитируемый пост)
вариант работы со строкой в общем случае - не лучше?

Можно и со строкой. (все равно придется вводить формат на количество цифр после запятой)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)