1 / 1 / 1
Регистрация: 28.09.2012
Сообщений: 91
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день, вот простенькая задача:

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

Вова купил билет в трамвае 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", в чем проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2013, 16:27
Ответы с готовыми решениями:

Найти слова, повторяющиеся более одного раза, не могу найти ошибку
#include &lt;iostream&gt; using namespace std; void obr1(char **s, char **mas, int n, int m) { int...

Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку)
// Заданы матрицы X(8;4),Y(5;5),Z(6;9). // Для каждой из матриц определить строку, в которой...

Не могу найти ошибку
Компилятор выдает такую ошибку: fatal error C1075: конец файла обнаружен ранее, чем левая фигурная...

Не могу найти ошибку
Не высчитывается значение U_n и E_kvd_ot_r_n,точнее выдёт nan. #include &lt;iostream&gt; #include...

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

Добавлено через 3 минуты
еще, вот тут Q(k) массив k изменится, и вторая функция будет работать с измененным массивом.
1
1 / 1 / 1
Регистрация: 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";

Может я кладываю и вычетаю неправильно?
0
127 / 125 / 16
Регистрация: 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
1
1 / 1 / 1
Регистрация: 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
0
13.03.2013, 18:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2013, 18:01
Помогаю со студенческими работами здесь

ошибку не могу найти(
не могу понять почему не считает((((( #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt;...

Не могу найти ошибку.
народпомогите 1-й масив счтитае а второй нет, не могу найти ошибку #include &quot;stdafx.h&quot; ...

Не могу найти ошибку!
Пробую что-то вычудить..... не могу найти ошибку (просто интересно) #include &lt;iostream&gt; using...

Не могу найти ошибку
Условие задачи: Написать функцию решения квадратного уравнения. Помогите найти ошибку: ...


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

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

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