Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Проверка правильности кода

#cpp



  В городе N есть большой склад на котором существует 50000 различных
  полок. Для удобства работников руководство склада решило заказать для
  каждой полки табличку с номером от 00001 до 50000 в местной
  типографии, но когда таблички напечатали, оказалось что печатный
  станок из-за неисправности не печатал цифру 2, поэтому все таблички, в
  номерах которых содержалась одна или более двойка (например, 00002 или
  20202) — надо перепечатывать. Напишите программу, которая подсчитает
  сколько всего таких ошибочных табличек оказалось в бракованной партии.


Мой код

#include 
#include 
using namespace std;

int main()
{
    setlocale(LC_ALL, "Russian");

    int num = 0, rez = 0, i1 = 0;
    for (int i = 1; i < 50000; i++)
    {
        num = i;
        while (num > 0)
        {
             if (num % 2 == 0)
             {
                 ++rez;
                 break;

             }
             num /= 10;
         }
    }
cout << rez << "\n";`
system("pause");
return 0;
}


Я нахожу только четные числа. Подскажите, как определить, есть ли в числе двойка. 
    


Ответы

Ответ 1



Найдем общее количество чисел, которые кончаются на 2. В общем случае это n/10, здесь 5000. Отбросим эти числа, останется 45000, причем у каждых 9 первые 4 цифры одинаковые. Получим рекуррентную формулу f(n)=n/10+9*f(n/10) Причем для однозначных чисел, например 5, f(5)=1 Написать такую программу очень просто, и работает быстро. Ответ должен получится 23756. int tab(int n) { if( n>=2 && n<10) return 1; return n /10+9*f(n/10); }

Ответ 2



if (num % 2 == 0) { ++rez; break; } Так как Вы проверяте не является ли цифра цифрой 2, а четное ли само число, Ваш код не работает. Замените на if (num % 10 == 2) { ++rez; break; } Такой вариант кода полностью рабочий, но не оптимальный для больших num. Есть более быстрые способы считать кол-во таких чисел, но это совсем другая история.

Ответ 3



Решение не верно, то что число делится на 2 не означает, что 2 – его последняя цифра. #include #include using namespace std; int main(){ setlocale(LC_ALL, "Russian"); int num = 0, rez = 0, i1 = 0, cipher=0; for (int i = 1; i < 50000; i++){ num = i; while (num > 0){ cipher = num % 10; //получаем последнюю цифру числа if (cipher == 2){ ++rez; break; } num /= 10; //отбрасываем последнюю цифру числа } } cout << rez << "\n"; system("pause"); return 0; }

Ответ 4



Тупо аналитически. У нас есть: (50000 - 10*0) / 10 - последнее число двойка (50000 - 10*1) / 10 - второе с конца число двойка (50000 - 10*2) / 10 - третье с конца число двойка (50000 - 10*3) / 10 - четвертое с конца число двойка (50000 - 10*4) / 10 - пятое с конца число двойка Их сумма даст ответ. Решается очевидным циклом, но вообще должно бы решаться на бумажке, для такого программы не пишут.

Комментариев нет:

Отправить комментарий