0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 5
1

Наличие введенной цифры в дробной части числа

26.12.2009, 19:27. Показов 2608. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, уважаемые!
Помощь нужна в следующем:
Пользователь вводит число типа double. Далее вводит некую цифру M. Требуется определить, сколько раз введенная цифра встречается в дробной части нашего числа. Вот мой вариант, но он неэффективен, если в числе присутствует нуль:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <math.h>
int main()
{
    double p;
    int m,buffer,i;
    i=0;
    std::cout << "vvedite p" << std::endl;
    std::cin >> p;
    std::cout << "vvedite m" << std::endl;
    std::cin >> m;
 
    while (buffer!=0)
    {
    P-=floor(P);
    P*=10;
    buffer=floor(P);
    if (M==buffer)
    i++;
    P-=buffer;
      }
    std::cout << i;
    
      return 0;
}
В принципе программа-то простенькая, но не могу придумать, как остановить цикл. Я пробовал сначала переводить дробную часть в char, потом посимвольно переводил в массив и там уже проще было работать, но при использовании sprintf мне выдавалась строка только с 8 элементами, то есть если, допустим, число 3.45464748, то при конвертации получалось только 0 0 4 5 4 6 4 7 =\
Направьте на путь истинный =)
Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2009, 19:27
Ответы с готовыми решениями:

Найти произведение первой цифры целой части и третьей цифры дробной части вещественного числа
Помогите написать программу в Паскале Найти произведение первой цифры целой части и третьей цифры...

Вывести 3 цифры из дробной части вещественного числа
Учитель с Информатики дал задачу. Без div и mod. Дано действительное число x. Через запятую...

Получить определенные цифры дробной части числа
Здравствуйте. Подскажите, как это можно сделать быстрее. Допустим, есть дробное число...

Нахождение первой цифры дробной части числа с плавающей точкой
Нужно написать программу, которая находит первую цифру дробной части числа с плавающей точкой...

15
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
26.12.2009, 20:10 2
могу посоветовать ввести ограничение на i.
1
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 5
26.12.2009, 20:30  [ТС] 3
Цитата Сообщение от Sekt Посмотреть сообщение
могу посоветовать ввести ограничение на i.
Каким образом, не поясните?
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
26.12.2009, 20:35 4
Floom, Со строками не хотите попробовать решить?
0
24 / 24 / 1
Регистрация: 25.12.2009
Сообщений: 86
26.12.2009, 20:39 5
Преобразуй дробную часть в строку и потом при помощи strncmp() сравнивай каждую цифру с твоей и считай, сколько раз совпала
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
26.12.2009, 20:41 6
Вот так можно, только с длинными числами как-то криво работает...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cmath>
using std::cin;
using std::cout;
using std::endl;
 
int main(){
    double num;
    int digit;
    size_t count;
    
    cout << "Enter double value: ";
    cin >> num;
    cout << "Digit to find: ";
    cin >> digit;
    
    count = 0;
    while ( num - floor(num) > 0.0 ) {
        if ( digit == (int)((num - floor(num)) * 10.0) )
            ++count;
        num *= 10.0;
    }
    cout << "Digit " << digit << " meet " << count << " times" << endl;
    
    return 0;
}
1
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 5
26.12.2009, 21:06  [ТС] 7
Преобразовать при помощи чего? Я пробовал ввести char str[10] и потом sprintf(str, "%d", P), но в str функция записывала только 8 символов, как я написал выше.

Добавлено через 6 минут
easybudda, работает в принципе нормально, но вот опять проблема, если в дробной части будет 0, то уже идет не так. По пути, который я тут выложил, мне посоветовали пойти. Я сначала пробовал переводить в строку, чтобы избежать нулевого элемента, да и здесь тоже советуют строки использовать, но вот какой функцией лучше перевести...

Добавлено через 14 минут
Вот, посмотрите, пожалуйста. Это вариант со строками и массивом. Знаю, неэффективен также из-за того, что памяти много тратится, но пофигу, главное, чтоб работало. Но вот почему-то sprintf берет только 8 символов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
 
int main()
 
{
    double M,P,buffer;
    int i,dlina;
    int arr[20];
    char str[20];
    i=0;
    cout << "Vvedite chislo P" << endl;
    cin >> P;
    
    cout << "Vvedite cifru M" << endl;
    cin >> M;
    
    buffer=0.0;
    
    P-=floor(P);
    
    sprintf(str, "%f", P);
    
    cout << str << endl;
    cout << endl;
 
    dlina=strlen(str);
    
           for (i=0; i<dlina; i++)
    {
        char temp = str[i];
        arr[i] = atoi(&temp);
    }
 
    for (i=2; i<dlina; i++)
        cout << arr[i] << " ";
        cout << endl;
 
    buffer=0;
 
    for (i=2; i<dlina; i++)
    {
        if (arr[i]==M)
        buffer++;
    }
    cout << "Vvedennaya cifra vstrechaetsa" << " " << buffer << " " << "raz" << endl;
 
  return 0;
}
0
24 / 24 / 1
Регистрация: 25.12.2009
Сообщений: 86
26.12.2009, 21:07 8
Например так можно из double в string перевести. Дальше - дело техники =)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include "string"
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    double p =22.5;
    int temp, num = 5;
    temp=p;
    p -= temp;
    std::string str;
    str = fcvt(p, num, &num, &num);
    std::cout << str;
    std::cin.ignore();  
    return 0;
}
1
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
26.12.2009, 21:09 9
Floom, А зачем переводить. Сразу считывайте, например, в переменную типа char p[10] первое значение. А второе считывать в переменную типа char m
1
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 5
26.12.2009, 21:24  [ТС] 10
Огромное спасибо отписавшимся, буду пробовать.
0
24 / 24 / 1
Регистрация: 25.12.2009
Сообщений: 86
26.12.2009, 21:26 11
Если не получится, как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include "string"
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    int count=0, temp, num = 10;
    char M;
    double p;
    std::cin>>p >> M;
    temp=p;
    p -= temp;
    std::string str;
    str = fcvt(p, num, &num, &num);
    num=10;
    for(int i=0; i<num; i++)
    {
        if (M == str[i])count++;
    }
    std::cout << count;
    return 0;
}
P.S. num - количество знаков после запятой
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
26.12.2009, 21:26 12
Цитата Сообщение от Floom Посмотреть сообщение
easybudda, работает в принципе нормально, но вот опять проблема, если в дробной части будет 0, то уже идет не так.
В каком смысле?
Наличие введенной цифры в дробной части числа
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
26.12.2009, 21:28 13
valeriikozlov, полностью с тобой согласен, ведь указан только тип данных, которые нужно обработать и не указуется как именно обрабатывать, а ведь проще всего - строками..
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
26.12.2009, 21:31 14
Floom, Кстати проверил код easybudda не нашел там недочетов в работе. Все работает правильно.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
26.12.2009, 21:40 15
Floom, На С и не заморачиваясь проверками вот так бы могло выглядеть
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
 
int main(void){
    char buf[BUFSIZ], c, *p;
    size_t count = 0;
    
    printf("Number: ");
    fgets(buf, sizeof(buf), stdin);
    printf("Digit: ");
    scanf("%c", &c);
    
    if ( ( p = strchr(buf, '.') ) == NULL ){
        printf("Wrong number!\n");
        return 1;
    }
    while ( p = strchr(++p, c) )
        ++count;
    printf("Meet %d times\n", count);
    
    return 0;
}
На С++ по той же логике, только вместо char buf[BUFSIZ] и *p - std::string и std::string::iterator...
0
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 5
26.12.2009, 21:46  [ТС] 16
easybudda, Прошу прощения, конечно, всё работает правильно.
Сделаю два варианта.
Всё, спасибо еще раз всем огромное за помощь!
Вопрос исчерпан.
0
26.12.2009, 21:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2009, 21:46
Помогаю со студенческими работами здесь

Присвоить переменной Х значение первой цифры из дробной части положительного вещественного числа.
uses crt; var a,b:real; begin clrscr; write('Введите число '); readln(a); b:=(a mod 1);...

Найдите в дробной части числа πи порядковый номер каждой цифры, начиная с 1
Найдите в дробной части числа πи Порядковый номер каждой цифры начиная с 1 встретившейся...

Проверить наличие введенной цифры в числе
С клавиатуры вводится число и какая то цифра, надо проверить если ли введенная цифра в введенном...

Выражение по возвращению старшей цифры дробной части
Записать выражение, возвращает старшую цифру дробной части меньшего из двух заданных действительных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru