Форум программистов, компьютерный форум CyberForum.ru

Преобразование последовательности - 2 (задача с acmp). Найти ошибку в коде - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Шаблон по умолчанию http://www.cyberforum.ru/cpp-beginners/thread928442.html
template <typename T = int> class A { public: A(){} }; int main(int argc, char *argv) {
C++ Checked_iter Здорова господа! Я тут пытаюсь создать свой Checked_iter, вот код который из книги набрал вроде кое-как работает://Chacked_iter #include <iostream> using std::cout; using std::endl; using std::cerr; #include <list> using std::list; #include <string> using std::string; http://www.cyberforum.ru/cpp-beginners/thread928435.html
C++ Быстродействие
Что лучше использовать, если быстродействие системы достаточно важно, а элемент используется часто? template <typename T> struct Point { T x, y; }; template <typename T>
C++ Не работает openmp
Написал простенькую программку с распараллеливанием собрал откомпилил, но распараллеливания нет. Программка выглядит так: -------------------------------- #include <iostream> #include <omp.h> int main(int argc, char* argv) { #pragma omp parallel num_threads(4)
C++ Каким образом getchar() меняет содержимое массива? http://www.cyberforum.ru/cpp-beginners/thread928386.html
Здравствуйте! Почему-то наличие getchar(); в коде влияет на содержимое массива. Если данный код не менять - то выводит правильный результат. Результат представлен на первом скрине. Если удалить первый getchar() с 21 строки, то в результате появляется абракадабра - представлено на втором скрине. Если удалить второй getchar(), то в результате вообще получаются нули - представлено на третьем...
C++ клас myDate Создайте класс Date, который будет содержать информацию о дате (день, месяц, год). С помощью механизма перегрузки операторов, определите операцию разности двух дат (результат в виде количества дней между датами), а также операцию увеличения даты на определенное количество дней. с++ class myDate { public: myDate(); ~myDate(); private: подробнее

Показать сообщение отдельно
nuts23
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 30
25.07.2013, 09:42     Преобразование последовательности - 2 (задача с acmp). Найти ошибку в коде
Здравствуйте.
Задана последовательность, содержащая n целых чисел. Необходимо найти число, которое встречается в этой последовательности наибольшее количество раз, а если таких чисел несколько, то найти минимальное из них, и после этого переместить все такие числа в конец заданной последовательности. Порядок расположения остальных чисел должен остаться без изменения.

Например, последовательность 1, 2, 3, 2, 3, 1, 2 после преобразования должна превратиться в последовательность 1, 3, 3, 1, 2, 2, 2.

Требуется написать программу, которая решает данную задачу.

Входные данные

Первая строка входного файла INPUT.TXT содержит число n — количество чисел во входной последовательности (3 ≤ n ≤ 100). Следующая строка содержит входную последовательность, состоящую из n целых чисел, не превышающих по модулю 100. Все числа в строке разделены пробелом.

Выходные данные

В выходной файл OUTPUT.TXT выводится последовательность чисел, которая получается в результате названного преобразования. Все числа в последовательности должны быть разделены пробелом.
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
#include <stdio.h>
#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int N;
    scanf("%d", &N);
    int A[100];
    int B[201]; // от B[1] до [99] - кол-ство упоминаний чисел. Отрицательные числа (-1 и -99), B[100] - ноль, B[123] - 23;
    for (int i = 0; i < 201; ++i)
        B[i] = 0;
    int a;
    for (int i = 0; i < N; ++i)
    {
        scanf("%d", &A[i]);
        a = A[i];
        if (a < 0)
        {
            a = abs(a);
            B[a] += 1;
        }
        else
        {
            a += 100;
            B[a] += 1;
        }
    }
    int imax; // кол-ство упоминаний
    int z; // самое часто упоминаемое число
    z = 1000;
    imax = -2000;
    for (int i = 0; i < 201; ++i)
    {
        if (B[i] == imax)
        {
            if (i < z)
            {
                imax = B[i];
                z = i;
            }
        }
        else if (B[i] > imax)
        {
            imax = B[i];
            z = i;
        }
    }
    //printf("%d_%d", imax, z);
    if (z <= 99)
        z *= -1;
    else
        z -=100;
    for (int i = 0; i < N; ++i)
    {
        if (A[i] != z)
            printf("%d ", A[i]);
    }
    for (int i = 0; i < imax; ++i)
    {
        printf("%d ", z);
    }
    return 0;
}
Необходимо найти ошибку в коде, т.к. на 8 тесте у меня WA. В обсуждении указано, что, скорее всего, ошибка в работе с отрицательными числами, но все указанные там тесты проходит.
Заранее спасибо.

Добавлено через 5 минут
Всё ок, исправил.
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
#include <stdio.h>
#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int N;
    scanf("%d", &N);
    int A[100];
    int B[201]; // от B[1] до [99] - отрицательные числа (-1 и -99), B[100] - ноль, B[123] - 23;
    for (int i = 0; i < 201; ++i)
        B[i] = 0;
    int a;
    for (int i = 0; i < N; ++i)
    {
        scanf("%d", &A[i]);
        a = A[i];
        if (a < 0)
        {
            a = abs(a);
            a = 100-a;
            B[a] += 1;
        }
        else
        {
            a += 100;
            B[a] += 1;
        }
    }
    int imax; // кол-ство упоминаний
    int z; // самое часто упоминаемое число
    z = 1000;
    imax = -2000;
    for (int i = 0; i < 201; ++i)
    {
        if (B[i] == imax)
        {
            if (i < z)
            {
                imax = B[i];
                z = i;
            }
        }
        else if (B[i] > imax)
        {
            imax = B[i];
            z = i;
        }
    }
    //printf("%d_%d", imax, z);
    if (z <= 99)
    {
        z = 100-z;
        z *= -1;
    }
    else
        z -=100;
    for (int i = 0; i < N; ++i)
    {
        if (A[i] != z)
            printf("%d ", A[i]);
    }
    for (int i = 0; i < imax; ++i)
    {
        printf("%d ", z);
    }
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 08:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru