Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение кол-ва вхождений числа в дробную часть 
:(
    Опции темы
Keeper89
Дата 16.12.2012, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Доброго времени суток.

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

#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 не работают.

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


--------------------
PM MAIL WWW   Вверх
volatile
Дата 17.12.2012, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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);



Это сообщение отредактировал(а) volatile - 17.12.2012, 01:07
PM MAIL   Вверх
Keeper89
Дата 17.12.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



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


--------------------
PM MAIL WWW   Вверх
bsa
Дата 17.12.2012, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



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

может. А если изначально вводить как строку, так и переводить не придется.  smile 
PM   Вверх
Keeper89
Дата 17.12.2012, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



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

Это сообщение отредактировал(а) Keeper89 - 17.12.2012, 12:01


--------------------
PM MAIL WWW   Вверх
volatile
Дата 17.12.2012, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0673 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.