Я не мог понять, почему моя функция не работает - PullRequest
0 голосов
/ 17 апреля 2020

Так что это должно удовлетворить потребности алгоритма Луна из 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;}
}

1 Ответ

0 голосов
/ 17 апреля 2020

Как указал Weather Vane, вместо этого проще использовать строку:

bool checkdigits(const char* number)
{
    long long sum1 = 0, sum2 = 0;

    for (int i = strlen(number) - 1; i >= 0; i -= 2) // single add every second
        sum1 += number[i] - '0';
    for (int i = strlen(number) - 2; i >= 0; i -= 2) // double add every other second
        sum2 += 2 * (number[i] - '0') - ((number[i] - '0') > 4 ? 9 : 0);
                                       // number > 4 => 2 * number > 10
                                       // therefore subtract 9

    return (sum1 + sum2) % 10 == 0;
}

Я не знаю cs50, но это должно сработать.

...