Попытка переписать код, чтобы включить оператор модуля - PullRequest
0 голосов
/ 12 мая 2019

Проблема заключается в следующем:

Ввод - это "t" количество наборов данных, за которыми следуют t 11-значных чисел. В код включен шифр в виде массива. Код должен умножать последующие цифры от входного числа на соответствующие цифры из шифра, создавая таким образом сумму 11 умножений. После этого код проверяет, делится ли сумма на 10. Если это так, он возвращает «правильно», если нет - «неправильно».

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

Я нашел код для простого экстрактора цифр в обратном порядке (используя цикл while и% 10), но у меня возникли некоторые проблемы с его реализацией в моем коде ... Любая помощь будет признательна.

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
   long long int number;
   int cipher [11] = {1,3,7,9,1,3,7,9,1,3,1};
   int t, digit, sum;

   cin >> t;
   for (int i=0; i<t; i++)
   {
        sum = 0;
        cin >> number;

        for (int j=10; j>=0; j--)
        {
            digit = fmod(number/(pow(10,(10-j))),10);
            sum = sum + digit*cipher[j];
        }
        if (sum%10==0)
            cout << "Correct" << endl;
        else
            cout << "Incorrect" << endl;
   }
   return 0;
}

Пример правильного числа: 44051401458. Мы предполагаем, что все входные числа всегда 11 цифр.

1 Ответ

1 голос
/ 12 мая 2019

Я думаю, это то, что вы имеете в виду. Вы можете просто продолжить деление числа на 10, что сместит десятичную точку. Он не превратится в число с плавающей точкой, поскольку вы определили число как int (long long int), поэтому любая десятичная точка просто стирается, и вы можете свободно использовать модуль.

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
   long long int number;
   int cipher [11] = {1,3,7,9,1,3,7,9,1,3,1};
   int t, digit, sum;

   cin >> t;
   for (int i=0; i<t; i++)
   {
        sum = 0;
        cin >> number;
        for (int j=10; j>=0; j--)
        {
            digit = number%10;
            number = number/10;
            sum = sum + digit*cipher[j];
        }
        if (sum%10==0)
            cout << "Correct" << endl;
        else
            cout << "Incorrect" << endl;
   }
   return 0;
}

...