#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 - пятое с конца число двойка Их сумма даст ответ. Решается очевидным циклом, но вообще должно бы решаться на бумажке, для такого программы не пишут.
Комментариев нет:
Отправить комментарий