Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 19.09.2022
Сообщений: 3
1

Поиск рациональных чисел в последовательности

29.02.2024, 00:08. Показов 2810. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ваша задача - создать программу, которая сначала считывает растущую последовательность рациональных чисел и запоминает эту последовательность. Для решения задачи можно использовать только типы данных для целых чисел (например, int или long) и символов (char), т. е. не float и т. п. Эти рациональные числа имеют от 0 до 10 знаков после запятой (т. е. цифр после запятой).
Следовательно, на вход этой программы будет подано произвольное рациональное число (в том же формате, что и числа, образующие последовательность выше), а суть программы заключается в том, чтобы для каждого заданного числа найти это число в заданной последовательности и вернуть позицию (т.е. порядковый номер) найденного числа. Последовательность чисел нумеруется, начиная с 1. Если заданное число не найдено в последовательности, программа возвращает 0.
Сначала на вход подается натуральное число N (в диапазоне от 1 до 50000), представляющее собой размер последовательности. Затем следуют N строк, каждая из которых содержит одно число из последовательности.
За этой последовательностью следует натуральное число M (в диапазоне от 1 до 100000), выражающее количество чисел для поиска. Затем следуют M строк, каждая из которых содержит одно число, которое необходимо найти в заданной последовательности.
На выходе получаются числа, представляющие порядок следования заданных чисел в последовательности, причем каждое число находится в отдельной строке.


Написал код , но почему-то бинарный поиска не работает правильно при таком вводе
10
-849243,9810
-555,434
-555,230
-40,10993
0,231
3,141592
239
10934,234
234301,0
294348134
6
-555,23
808
239
0,231
234301,0
-555,434

Вывод должен быть
3
0
7
5
9
2

А выводит
0
0
7
5
9
2

КОД

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <stdio.h>
#include <stdlib.h>
 
typedef struct Cisla {
    long long celecislo;
    long long descislo;
    long long pocetdes;
} Cislo;
 
Cislo RacCislo(char *str) {
    Cislo rc = {0, 0, 0};
    int pos = 0;
    sscanf(str, "%lld%n", &rc.celecislo, &pos);
    if (str[pos] == ',') {
        pos++;
        char* desCast = str + pos;
        sscanf(desCast, "%lld", &rc.descislo);
        for (int i = 0; desCast[i] != '\0'; i++) {
            rc.pocetdes++;
        }
        while(rc.pocetdes<10)
        {
            rc.descislo*=10;
            rc.pocetdes++;
        }
    }
 
    return rc;
}
 
int NajdRac(Cislo rc1, Cislo rc2) {
    return rc1.celecislo == rc2.celecislo && rc1.descislo == rc2.descislo;
}
 
int binarnehlad(Cislo *numbers , int N , Cislo num2) {
    int niz = 0, hore = N - 1; 
    while (niz <= hore) {
        int med = niz + (hore - niz) / 2;
        if (NajdRac(numbers[med], num2) == 1) {
            return med;
        } else if (numbers[med].celecislo < num2.celecislo || numbers[med].celecislo == num2.celecislo && numbers[med].descislo < num2.descislo) {
            niz = med + 1;
        } else {
            hore = med - 1;
        }
    }
    return -1;
}
 
int main() {
    int N, M;
 
    scanf("%d", &N);
    Cislo* numbers = (Cislo*)malloc(N * sizeof(Cislo));
 
    char buff[45];
    for (int i = 0; i < N; i++) {
        scanf("%s", buff);
        numbers[i] = RacCislo(buff);
    }
 
    scanf("%d", &M);
 
    for (int i = 0; i < M; i++) {
        scanf("%s", buff);
        Cislo num2 = RacCislo(buff);
        int najd = binarnehlad(numbers, N, num2);
        if(najd != -1)
        {
            printf("%d", najd + 1);
        }
        else
        {
            printf("0");
        }
        if (i != M - 1) {
            printf("\n");
        }
    }
 
    free(numbers);
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.02.2024, 00:08
Ответы с готовыми решениями:

Определение вещественного числа с помощью последовательности рациональных чисел (последовательность Коши)
Здравствуйте! Столкнулся с тем, что не до конца понимаю, какой смысл имеет задание...

Класс дробей рациональных чисел, являющихся отношением двух целых чисел
Как сделать, чтобы можно было число записать в виде дроби ? например- Введите первое число:...

Описать класс дробей – рациональных чисел, являющихся отношением двух целых чисел
Описать класс дробей – рациональных чисел, являющихся отношением двух целых чисел. Предусмотреть...

Описать класс дробей-рациональных чисел, являющихся отношением двух целых чисел
Описать класс дробей-рациональных чисел, являющихся отношением двух целых чисел. Предусмотреть...

Описать класс дробей — рациональных чисел, являющихся отношением двух целых чисел
Описать класс дробей — рациональных чисел, являющихся отношением двух целых чисел.Предусмотреть...

5
Модератор
Эксперт функциональных языков программированияЭксперт Python
36818 / 20381 / 4228
Регистрация: 12.02.2012
Сообщений: 33,729
Записей в блоге: 13
29.02.2024, 10:21 2
Пытаюсь разобраться в коде... Рациональное число - это пара целых чисел (числитель и знаменатель). В коде создана структура с тремя полями. Зачем третье поле?
0
0 / 0 / 0
Регистрация: 19.09.2022
Сообщений: 3
29.02.2024, 10:36  [ТС] 3
3 поле нужно чтобы посчитать количество чисел после запятой для каждого числа .

Добавлено через 2 минуты
3 поле это поле создано для подсчёта знаков после запятой для каждого числа
0
Вездепух
Эксперт CЭксперт С++
11714 / 6392 / 1725
Регистрация: 18.10.2014
Сообщений: 16,124
29.02.2024, 11:15 4
Цитата Сообщение от Artur13172 Посмотреть сообщение
3 поле это поле создано для подсчёта знаков после запятой для каждого числа
Так а что тогда означают два других поля???

Если это числитель и знаменатель, то о каком "знаков после запятой" может вообще идти речь? У числителя и знаменателя нет никакой "запятой".

Если это НЕ числитель и знаменатель, то что тогда?
0
0 / 0 / 0
Регистрация: 19.09.2022
Сообщений: 3
29.02.2024, 12:39  [ТС] 5
Код разделяет числа 3,025 , -555,786 на целую часть и часть после запятой. Так как в задании нельзя использовать типы float и double . Я задаю их как массив char а потом разбиваю их по запятой на целые числа . А потом сравниваю .
0
Вездепух
Эксперт CЭксперт С++
11714 / 6392 / 1725
Регистрация: 18.10.2014
Сообщений: 16,124
29.02.2024, 19:20 6
Лучший ответ Сообщение было отмечено Artur13172 как решение

Решение

Цитата Сообщение от Artur13172 Посмотреть сообщение
3 поле нужно чтобы посчитать количество чисел после запятой для каждого числа .
То есть ваш способ представления рациональных чисел не в состоянии точно представить такое рациональное число, как 1/3.

Цитата Сообщение от Artur13172 Посмотреть сообщение
Код разделяет числа 3,025 , -555,786 на целую часть и часть после запятой.
Тогда еще раз: в чем смысл поля pocetdes если оно у вас всегда в итоге равно 10 для чисел, в записи которых была запятая? (И равно 0, когда запятой не было.) Например, 1,0 у вас превращается в { 1, 0, 10 }, а просто 1 - в { 1, 0, 0 }. В чем необходимость такого различия?

В дальнейшей обработке это поле никак не участвует.

Цитата Сообщение от Artur13172 Посмотреть сообщение
А потом сравниваю .
Сравнение у вас выполнено неправильно, что будет проявляться на отрицательных числах. Ваше сравнение будет считать, что число -25,25 меньше, чем число -25,26. А на самом деле наоборот. Поэтому у вас и получается ерунда при бинарном поиске отрицательного числа.
1
29.02.2024, 19:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.02.2024, 19:20
Помогаю со студенческими работами здесь

Описать класс дробей - рациональных чисел, являющихся отношением двух целых чисел
Описать класс дробей - рациональных чисел, являющихся отношением двух целых чисел. Предусмотреть...

Описать класс дробей — рациональных чисел, являющихся отношением двух целых чисел
Каждый разрабатываемый класс должен, как правило, содержать следующие элементы: скрытые поля,...

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

Описать класс дробей — рациональных чисел, являющихся отношением двух целых чисел
Помогите,пожалуйста.. 1)В одномерном массиве, состоящем из п вещественных элементов, вычислить: •...

Выяснить является ли векторным пространством над полем рациональных чисел Q множество чисел вида:
Выяснить является ли векторным пространством над полем рациональных чисел Q множество чисел вида: ...


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

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