Как отделить остаток от длинного длинного номера?

Я прохожу курс CS50 на edx.org; она называется «Введение в информатику».

Я пытаюсь решить набор задач 1-й недели. Итак, пользователь вводит номер кредитной карты, и мне нужно разработать какой-то алгоритм, чтобы проверить, действителен ли его номер. Для этого мне нужно разделить все 16-значное число на цифры. И я застрял здесь. Я предполагаю, что мне нужно сделать это в цикле, получая на каждом шаге цифру за цифрой, и для этого я хотел разделить ввод пользователя на 10 на каждом шаге и каким-то образом получить остаток.

Я не могу преобразовать тип int из-за ограничений int на количество цифр, которые он может содержать. Как я могу реализовать такую ​​​​функцию? Я попробовал это, но потом понял, что это ни к чему не приводит... По крайней мере, на первый взгляд. cre_num остается для кредитного номера.

long long check(long long cre_num)
{
    double part, i;

    for (i = 0.1; i <= 1; i = i+0.1)
    {
        if (cre_num/10 == i)
        {
            part = i;
        }
    }
    return part;
}

person Vladislav Kovechenkov    schedule 05.01.2017    source источник
comment
Понятно! Спасибо большое, не думал о такой реализации.   -  person Vladislav Kovechenkov    schedule 05.01.2017
comment
Значение long long cre_num/10 никогда не будет равняться значению double в диапазоне от 0,1 до 0,9. Оно может равняться 1.0, но i в цикле никогда не может быть даже 1.0, потому что числа с плавающей запятой ломаются, когда дело доходит до добавления неизбежно неточного кода 0.1, добавленного к самому себе 9 раз и ожидающего, что оно будет равно 1.0. Если номер карты вводился цифра за цифрой: сохраните его таким образом, если хотите проверить каждую цифру.   -  person Weather Vane    schedule 05.01.2017
comment
Вы должны включить тег cs50   -  person Sanjay-sopho    schedule 06.01.2017
comment
@ Санджай-софо: почему? Ничто в вопросе не требует этого (если только вы не включите программное обеспечение, programming и [tag:credit-card).   -  person Jongware    schedule 06.01.2017
comment
Вы можете прочитать номер кредитной карты в виде строки; тогда у вас есть все цифры, разделенные красиво для вас. Вы можете достаточно легко преобразовать каждый цифровой символ в число (вычтите код символа для нулевой цифры, также известный как '0' — обратите внимание, что это сильно отличается от '\0').   -  person Jonathan Leffler    schedule 09.01.2017
comment
@RadLexus: вопрос исходит из набора проблем CS50; такие вопросы должны быть помечены cs50, чтобы их могли легко найти другие, изучающие курс. Вы можете рассмотреть вопрос о переносе вопроса на CS50 Stack Exchange.   -  person Jonathan Leffler    schedule 09.01.2017
comment
Но @JonathanLeffler, происхождение вопроса не является проблемой для закрытия, переноса или (даже) ответа/не ответа на вопрос о переполнении стека? Я имею в виду, что вопрос касается некоторого кода, ни одна часть которого не использует что-либо в заголовке cs50, и, глядя на него, ответ не требует этого.   -  person Jongware    schedule 09.01.2017
comment
@RadLexus: В качестве альтернативы удалите все упоминания о CS50. Это первый абзац и первое предложение следующего абзаца. Пока вопрос не отображается в критерии поиска SO «[c] -[cs50] is:q cs50», меня не волнует, связано ли это с тем, что он получил тег или потерял ссылку на CS50. Есть 8 вопросов, которые случайно совпадают с этим поиском — я стараюсь, чтобы так и было. (Нет, я не в восторге от этих 8, но нет способа легко их исправить.)   -  person Jonathan Leffler    schedule 09.01.2017


Ответы (1)


Вам нужно поместить в вектор или что-то в этом роде 16 цифр числа (long int)?

Когда вы увеличиваете число на 10, вы получаете его последнюю цифру, например:

13%10 = 3
3%10 = 3 (03 = 3)
523%10 = 3

Итак, если вы %10, вы получите последнюю цифру и вставите свой вектор, а затем /10, потому что /10 удалит последнюю цифру, ту, которую вы уже сохранили.

Если хочешь, я могу попробовать закодировать, но я думаю, что ты уже это сделал.

person Gabriel Pellegrino    schedule 05.01.2017
comment
Подразумевается, что я еще ничего не слышал о массивах и векторах. Но это хорошо, большое спасибо. Я уже предлагал потанцевать вокруг ASCII, так что я думаю, что это ключ. Не нужно кодировать, я просто искал идею. Еще раз спасибо, хорошего дня. - person Vladislav Kovechenkov; 05.01.2017
comment
Ох, хорошо. Если вам нужна только идея, игнорируйте вторую часть, где я хотел хранить ваши данные. Хорошего дня =) - person Gabriel Pellegrino; 05.01.2017