Общий алгоритм добавления цифр (при условии целочисленного типа):
- Инициализируйте вашу сумму равной 0:
sum = 0
- Извлеките младший ди git из числа используя оператор модуля
%
: digit = number % 10
- Добавьте значение этого di git к сумме:
sum += digit
(сокращение для sum = sum + digit
) - Разделите число на 10:
number /= 10
(сокращение от number = number / 10
- Если после деления на 10 число ненулевое, обратно на 2
- Конец
Оператор модуля %
возвращает целочисленный остаток от целочисленного деления - 123 / 10 == 12 rem 3
. Таким образом, остаток от деления числа на 10 является наименьшим значащим десятичным числом git от числа. Обратите внимание, что целочисленное деление дает вам целое число результат - 123 / 10 == 12
, а не 12.3
.
Вы захотите поместить это в отдельную функцию, чтобы вы могли написать что-то вроде
int sumdig( int v )
{
...
}
int main( void )
{
int value = 123;
int sum = sumdig( value ); // sumdig will return 1 + 2 + 3, or 6
...
}
Когда вы создаете куча отдельных переменных одного и того же типа с тем же именем, за исключением некоторой привязанной ордина l (var1
, var2
, var3
или first_thing
, second_thing
, third_thing
), это действительно сильный совет, который вы хотите использовать array . Вы можете использовать массив для хранения отдельных цифр номера вашей карты:
int number[16];
и использовать метод % 10
, как описано выше, чтобы извлечь отдельные цифры:
long tmp = credit_card_number; // use a temporary so we preserve the original card number
for ( int i = 0; i < 16; i++ )
{
number[i] = tmp % 10;
tmp /= 10;
}
This означает, что наименее значащий (самый правый) номер карты di git будет сохранен в number[0]
, а самый значащий (крайний левый) номер карты di git будет сохранен в number[15]
, так что знайте об этом. Для проверки правильности числа это не имеет значения, но если вы хотите отобразить содержимое массива, вы должны принять это во внимание.
Использование массива облегчает извлечение подмножеств цифр:
for ( int i = 1; i < 16; i += 2 ) // hit every other element starting at element 1
{
number[i] *= 2; // multiply these digits by 2
}
То, что выше l oop выполняет «1 • 2 + 0 • 2 + 0 • 2 + 0 • 2 + 0 • 2 + 6 • 2 + 0 • 2 + 4 • 2 "часть вашего алгоритма.
Вы должны быть в состоянии выяснить остальное оттуда. Надеюсь это поможет.