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

356
26 октября 2017, 09:43

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

Мой код

#include <iostream>
#include <cmath>
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;
}

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

Answer 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);
}
Answer 2
if (num % 2 == 0)
         {
             ++rez;
             break;
         }

Так как Вы проверяте не является ли цифра цифрой 2, а четное ли само число, Ваш код не работает. Замените на

if (num % 10 == 2)
         {
             ++rez;
             break;
         }

Такой вариант кода полностью рабочий, но не оптимальный для больших num. Есть более быстрые способы считать кол-во таких чисел, но это совсем другая история.

Answer 3

Решение не верно, то что число делится на 2 не означает, что 2 – его последняя цифра.

#include <iostream>
#include <cmath>
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;
}
READ ALSO
ТЛ на одном тесте

ТЛ на одном тесте

Доброго времени суток! Решал задачу, условие прилагаетсяПроблема в том, что на одном тесте выдает ошибку времени (ограничение в полсекунды)

239
Не добавляется класс после удаления jquery

Не добавляется класс после удаления jquery

Хочу реализовать удаление и появления фотографий с использованием классов

326
prepend переворачивает результат

prepend переворачивает результат

Делаю цикл, обрабатывая json массив, получаю в итоге переменную с кучей option которые нужно вставить в начало select, делаю prepend и он вставляет их перевернутымиПробовал...

193
jquery активный chekbox

jquery активный chekbox

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

289