Так что это должно удовлетворить потребности алгоритма Луна из Harward cs50 pset1. Но в нем есть поток, который я не смог найти. Обычно условие while l oop не учитывается 8 раз, но во время тестирования я подумал: сначала нужно решить поток в работе функций. Алгоритм Луна работает следующим образом для тех, кто не может вспомнить:
Умножьте каждое другое число di git на 2, начиная с числа до последнего числа di git, а затем добавьте эти продукты 'цифры вместе.
Добавьте сумму к сумме цифр, которые не были умножены на 2.
Если последний di суммы git равен 0 (или, говоря более формально, если общее значение по модулю 10 соответствует 0), число является действительным!
И это пример ввода:
Это немного сбивает с толку, поэтому давайте попробуем пример с визой Дэвида: 4003600000000014.
Ради обсуждения:
давайте сначала подчеркнем все остальные di git,
, начиная с числа до второго числа di git:
4003600000000014
Хорошо, давайте умножим каждую из подчеркнутых цифр на 2:
1 • 2 + 0 • 2 + 0 • 2 + 0 • 2 + 0 • 2 + 6 • 2 + 0 • 2 + 4 • 2
Это дает нам: 2 + 0 + 0 + 0 + 0 + 12 + 0 + 8
Теперь давайте добавим эти продукты 'цифры (то есть, не сами продукты) вместе:
2 + 0 + 0 + 0 + 0 + 1 + 2 + 0 + 8 = 13
Теперь давайте добавим эту сумму (13 ) к сумме цифр, которые не были умножены на 2 (начиная с конца): 13 + 4 + 0 + 0 + 0 + 0 + 0 + 3 + 0 = 20
Да, последний di git в этой сумме (20) равно 0, поэтому карта Дэвида le git!
И это моя функция.
bool checkdigits(long long x)
{ int power();
int checklength();
long counter,sum,summ2,multp2,index;
sum=0;
summ2=0;
index=1;
counter=0;
while(!(counter == 8))
{
sum+=x/power(10,index)%10;
multp2=(x/power(10,index))%10*2;
if(multp2 >= 10)
{summ2 += (multp2 % 10)+1;}
else if(multp2 < 10)
{summ2 += multp2 % 10;}
index = index+2;
counter++;
}
if((sum + summ2)%10 == 0)
{return true;}
else
{return false;}
}