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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Harutyunyan
1 / 1 / 0
Регистрация: 28.09.2012
Сообщений: 91
#1

Не могу найти ошибку - C++

13.03.2013, 16:27. Просмотров 302. Ответов 4
Метки нет (Все метки)

Добрый день, вот простенькая задача:

"В одном шаге от счастья"
Кликните здесь для просмотра всего текста

Вова купил билет в трамвае 13-го маршрута и сразу посчитал суммы первых трёх цифр и последних трёх цифр номера билета (номер у билета шестизначный). Оказалось, что суммы отличаются ровно на единицу. «Я в одном шаге от счастья», — подумал Вова, — «или предыдущий или следующий билет точно счастливый». Прав ли он?
Входные данные

Входной файл INPUT.TXT содержит в первой строке число K – количество тестов. В следующих K строках записаны номера билетов. Количество тестов не больше 10. Номер состоит ровно из шести цифр, среди которых могут быть и нули. Гарантируется, что Вова умеет считать, то есть суммы первых трех цифр и последних трех цифр отличаются ровно на единицу.
Выходные данные

Выходной файл OUTPUT.TXT должен содержать K строк, в каждой из которых для соответствующего теста следует указать "Yes", если Вова прав, и "No", если нет.

Пример:
Код
INPUT.TXT                  OUTPUT.TXT
3
715068                       Yes
445219                       No
012200                       Yes


Ее конечно можно решить намного проще, например считать число и сложить/вычест 1, и полуть каждый разряд через деление - мне подобные решения не нужны.

Я попробовал подругому, тоесть представить номер билета в массиве, в каждом элементе 1 - разряд числа.
Вот мое решение:
Кликните здесь для просмотра всего текста

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
#include <fstream>
 
// Функуия возвращает истуну, если билет счастливый
bool Q(int *A, int q = 1)
{
    
    for(int i = 0; i < 6; i++)
        if(q > 0) // Получаю следующий номер билета
        {
            if(A[i] = 9)
            {
                A[i] += q;
                A[i + 1] %= 10; 
            } else break;
        } else // Получаю предыдущий номер билета
            if(A[i] < 1)
                A[i] = 9;   
            else {A[i + 1] -= 1; break;}
    
    /*Складываю или вычетаю 1, к последнему элементу, 
    и в зависимости от числа меняю остальные разряды.
    т.е если: 359999, при прибавлении 1, должно быть 360000, а при вычетании 1,
    350000, будет 349999*/
 
    int a = *A + A[1] + A[2],
    b = A[3] + A[4] + A[5];
 
    return (a == b);
}
 
int main()
{
    std::fstream I("input.txt"), O("output.txt", 2);
    char c;
    int a, b, n, k[7]; I >> n;
    while(n--)
    {
        // Число записываю в массив в обратном порятке, что бы легче
        // было получить номер предыдущего или следующего билета
        for(int i = 0; i < 6; i++) 
            I >> c, k[5 - i] = c - 48;
        O << (Q(k) || Q(k, -1) ? "Yes\n" : "No\n");
    }
}


Алгоритм всегда выводит "Yes", в чем проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2013, 16:27     Не могу найти ошибку
Посмотрите здесь:

C++ Не могу найти ошибку
Не могу найти ошибку C++
C++ Не могу найти ошибку...
C++ не могу найти ошибку
Не могу найти ошибку C++
Не могу найти ошибку C++
С++ не могу найти ошибку C++
Не могу найти ошибку C++
Не могу найти ошибку! C++
Не могу найти ошибку C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
13.03.2013, 17:01     Не могу найти ошибку #2
мм, может надо выводить NO только тогда, когда последняя цифры 9? Или в каких случаях еще билет не будет "счастливым"?

Добавлено через 3 минуты
еще, вот тут Q(k) массив k изменится, и вторая функция будет работать с измененным массивом.
Harutyunyan
1 / 1 / 0
Регистрация: 28.09.2012
Сообщений: 91
13.03.2013, 17:09  [ТС]     Не могу найти ошибку #3
Цитата Сообщение от ZoRT Посмотреть сообщение
в каких случаях еще билет не будет "счастливым"?
Билет счастливый - если сумма первых 3-х чисел равна сумме последних 3-х чисел.

А в задаче надо проверить является ли предыдущий номер билета или следующий счастливым.


А насчет второго спасибо, вот изменил функцию:

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
bool Q(const int *x, int q = 1)
{
    int A[7];
    for(int i = 0; i < 6; i++)
        A[i] = x[i];
 
    for(int i = 0; i < 6; i++)
        if(q > 0) 
        {
            if(A[i] = 9)
            {
                A[i] += q;
                A[i + 1] %= 10; 
            } else break;
        } else 
            if(A[i] < 1)
                A[i] = 9;   
            else {A[i + 1] -= 1; break;}
    
    int a = A[0] + A[1] + A[2],
        b = A[3] + A[4] + A[5];
 
    return (a == b);
}
Но всеравно выводит всегда "Yes";

Может я кладываю и вычетаю неправильно?
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
13.03.2013, 17:18     Не могу найти ошибку #4
C++
1
if(A[i] = 9)
это присваивание, сравнение ==
C++
1
2
A[i] += q;
A[i + 1] %= 10;
тут тоже что-то странное. может A[i + 1] надо было увеличить на 1, а A[i] присвоить 0?
только надо еще учесть, что A[i + 1] может быть равным 9
Harutyunyan
1 / 1 / 0
Регистрация: 28.09.2012
Сообщений: 91
13.03.2013, 18:01  [ТС]     Не могу найти ошибку #5
Цитата Сообщение от ZoRT Посмотреть сообщение
C++
1
if(A[i] = 9)
это присваивание, сравнение ==
C++
1
2
A[i] += q;
A[i + 1] %= 10;
тут тоже что-то странное. может A[i + 1] надо было увеличить на 1, а A[i] присвоить 0?
только надо еще учесть, что A[i + 1] может быть равным 9
О спасибо, в условии у меня опечатка, а вот насчет второго я что то действительно налепил не то))


Вот сделал так:

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
#include <fstream>
 
bool Q(int *x, int q = 1)
{
    int A[7];
    for(int i = 0; i < 6; i++)
        A[i] = x[i];
 
    for(int i = 0; i < 6; i++)
        if(q > 0) 
        {
            if(A[i] == 9)
            {
                A[i] = 0;
                A[i + 1] += 1; 
            } else break;
        } else
            if(A[i] < 1)
                A[i] = 9;
            else {A[i + 1] -= 1; break;}
 
    int a = *A + A[1] + A[2],
    b = A[3] + A[4] + A[5];
 
    return (a == b);
}
 
int main()
{
    std::fstream I("input.txt"), O("output.txt", 2);
    char c;
    int a, b, n, k[7]; I >> n;
    while(n--)
    {
        for(int i = 0; i < 6; i++) 
            I >> c, k[5 - i] = c - 48;
        O << (Q(k) || Q(k, -1) ? "Yes\n" : "No\n");
    }
}
Уже стало разные ответы выдавать, но всеравно не те))

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
if(A[i] == 9)
{
// Вот тут как вы и сказали надо проверить что A[i + 1] 
// может быть равен девяти, как это можно сделать?
A[i] = 0;
A[i + 1] += 1; 
} else break;
Добавлено через 5 минут
Вот делаю так:

C++
1
2
3
4
5
6
7
8
9
10
11
if(A[i] == 9)
{
    A[i] = 0;
    if(A[i + 1] < 9)
        A[i + 1] += 1;
    else
    {
        A[i + 1] = 0;
        A[i + 2] += 1; // А тут может быть что A[i + 2] равен 9
    }
} else break;
Но так я буду в некторых случаях(например при номере билета: 199999) выходить за предеы массива.

Добавлено через 8 минут
Я тут вывожу массив при каждой вызове функции Q()
И смотрю что при входных данных:

715068 программа при сложении выдает такое результат: 715068, а при вычетании такой: 715058

445219 программа при сложении выдает такое результат: 445220, а при вычетании такой: 445209

012200 программа при сложении выдает такое результат: 012200, а при вычетании такой: 011299
Yandex
Объявления
13.03.2013, 18:01     Не могу найти ошибку
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru