1

Тема: Визначити кількість чисел з непарними цифрами між двома числами

Ввести з клавіатури два натуральних числа m>100, n> m . Визначити кількість чисел між m, n, які складаються з непарних цифр, або мають різні цифри. Подання числа у вигляді структурованого типу (масивом або рядком) не використовувати .

Фрагмент коду:

 if (n > m)
        {
            int t = n;
            n = m;
            m = t;
        }

        for (int i = n; i <= m; i++)
        {
            bool check = true;
            int a = i;

            while (a != 0 && check)
            {
                check = (a % 10) % 2 == 0 || a >= 10;
                a /= 10;
            }

            if (!check)
                s++;
            else
            {
                a = i;

                while (a != 0 && check)
                {
                    for (int j = a / 10; j != 0 && check; j /= 10)
                        if (a % 10 == j % 10)
                            check = false;

                    a /= 10;
                }

                if (!a)
                    s++;
            }
        }

        if (n <= 100 || m < n)
        {
            cout << ("'m' > 'n' > 100 Repeat please...\n");
        }

    } while (n <= 100 || m < n); оні

    cout << "Number of numbers with odd or non-repeating digits: " << s << endl;

2 Востаннє редагувалося koala (22.10.2020 07:47:04)

Re: Визначити кількість чисел з непарними цифрами між двома числами

Вибачте за зауваження про вирівнювання - у вас збився лише перший рядок.

Alex555ua написав:
            bool check = true;
            int a = i;

            while (a != 0 && check)
            {
                check = (a % 10) % 2 == 0 || a >= 10;
                a /= 10;
            }

Це, я так розумію, має бути перевірка на те, що всі цифри непарні.
Але насправді a>=10 буде true, поки a має більше однієї цифри, а значить, і check буде true.
Вам треба десь так перевіряти:

            bool check = true;
            int a = i;

            while (a != 0 && check)
            {
                check = a % 2 == 1;//парне число завжди закінчується на парну цифру, тому %10 - зайва операція
                a /= 10;
            }

А ще краще записати це в for (for у C навмисно такий гнучкий для подібних випадків), і назвати змінні по суті

            bool all_odd = true;
            for(int number=i; number>=0 && all_odd; number/=10)
            {
                all_odd = number%2==1;
            }

Другий цикл (вкладений) виглядає коректним, але це краще було робити масивами, якщо ви вже їх учили. Чи бітовими операціями, але це напевно складніше для початківця.

            bool digits[10] = {false, false, false, false, false, false, false, false, false, false}; //це можна записати простіше, але для наочності так
            bool all_different = true;

            for(int number=i; number>=0 && all_different; number/=10)
            {
                int digit = number%10;
                if(digits[digit]) //якщо вже була ця цифра
                {
                    all_different = false;
                }
                else //якщо digit ще не було - позначаємо
                {
                    digits[digit] = true; 
                }
            }

Ніби так.