Я прохожу курс 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;
}
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'0'
— обратите внимание, что это сильно отличается от'\0'
). - person Jonathan Leffler   schedule 09.01.2017[c] -[cs50] is:q cs50
», меня не волнует, связано ли это с тем, что он получил тег или потерял ссылку на CS50. Есть 8 вопросов, которые случайно совпадают с этим поиском — я стараюсь, чтобы так и было. (Нет, я не в восторге от этих 8, но нет способа легко их исправить.) - person Jonathan Leffler   schedule 09.01.2017