![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 06.11.2011
Сообщений: 21
|
![]()
Определить количество чисел состоящих из n десятичных разрядов (n –
натуральное число, вводится пользователем, n <= 10) произведение цифр которого равно числу K (натуральное число, вводится пользователем, K < 9n). Учитывать, что число может начинаться с нулей: 0042345 код на C) |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 03.06.2009
Сообщений: 1,871
|
![]()
т.е. например, число 345, 354, 435, 453 ,543, 534 - при перемножнении их разрядов 5*4*3 = 60 - они все дадут одно и то же самое число.
далее, получаестя, вам необходимо узнать сколько вообще в числе разрядов, например, в числе 1000 их 4, а в нашем случае, скажем, 345 - их всего 3 (т.к. всего 3 цифры в числе). тогда таких чисел будет всего 3! = 6 (смотрите верхний ряд чисел и считайте). Ответ: всего 6 чисел, состоящих из 3 разрядов дадут такой вот результат. Факториал надо использовать, если я правильно понял задачу...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
|
![]() |
![]() |
![]() |
#3 | |
Пользователь
Регистрация: 06.11.2011
Сообщений: 21
|
![]() Цитата:
для двухразрядного максимальное произведение 81(9^2) при комбинации цисла 9*9=81(оно максимальное 2-разрядное) а минимальное для -х разрядов 11. для трехразрядного максимальное произведение 729(9^3) число 9*9*9=729. ну и т.д т.е число К варьируется для каждого разряда в пределах возможных произведений. P.S. трехзначные для К=61 сколько комбинаций?? по моему 0. для К=62 0 для к=63 373 733 337 971 791 197 179 917 3*7*3=63 ответ: для К=63 чисел будет 8. Последний раз редактировалось sheff123; 06.11.2011 в 11:38. |
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 06.11.2011
Сообщений: 21
|
![]()
Решил её, не красиво получилось, код огромный да и думаю есть способ полегче:
Код:
|
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
а не проще ли сделать следующее: цикл от 1 до (10^N-1) (10 в степени N элементарно найти) внутри цикла вызывать процедурку, которая РАСКЛАДЫВАЕТ число на отдельные цифры ( с помощью получения целого остатка от деления на 10 и целочисленного деления исходного числа на 10). получаемые цифры перемножаются. Полученное произведение функция возвращает. если оно совпадает с числом K - увеличиваем счётчик на 1. Всё. p.s. я бы написал готовый код, благо что его всего пяток строк.. но, к сожалению и стыду своему, C/С++ совсем не знаю... |
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 18.10.2009
Сообщений: 185
|
![]()
В принципе задачу можно решить и оптимальным образом (перебирая несколько тысяч вариантов вместо миллиардов).
Для начала, число K нужно разложить на простые числа в диапазоне от 2 до 9 (т.е. 2, 3, 5, 7) Скажем, количество каждых сомножителей запишем в массив A[]. Т.е. A[2] – количество вхождений числа 2 в разложение числа K. Такое разложение будет единственным. Дальше нужно проверить несколько вариантов две двойки могут дать цифру 4 две тройки могут дать цифру 9 тройка и двойка могут дать цифру 6 (остальные варианты не проверяем т.к. они дают числа большие 9) Т.е. сделать примерно такой цикл Код:
Рассчитываем, сколькими вариантами эти цифры можно уложить для 1 значного числа для 2х значного числа и.т.д. до n (вернее i = A[2]+A[3]+A[4]+A[5]+A[6]+A[6]+A[8]+A[9] до n) считаем что числа в незаполненных позициях равны 1, но само число с 1 не начинаеться. Также проверяем вариант, что если число начинается с единиц. То количество вариантов умножается на это количество единиц, т.е. умножаем на n-i+1 (т.к. начальные единицы могут быть нулями по условию) Это конечно очень грубый план, и скорее направление в котором можно размышлять. Но на реализацию всёго этого (у профессионального программиста) уйдёт полдня как минимум (а может и больше).
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает." Последний раз редактировалось val_nnm; 07.11.2011 в 14:07. |
![]() |
![]() |
![]() |
#7 | |
Пользователь
Регистрация: 06.11.2011
Сообщений: 21
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 18.10.2009
Сообщений: 185
|
![]()
Потомучто цифр только 9.
Например если k=9^n=3^(2*n) тогда изначально мы рабтаем с массивом A[2] = 0, A[3]=2*n, A[4]=0, A[5]=0, A[6]=0, A[7]=0, A[8]=0, A[9]=0 затем проверим A[2] = 0, A[3]=2*n-2, A[4]=0, A[5]=0, A[6]=0, A[7]=0, A[8]=0, A[9]=1 A[2] = 0, A[3]=2*n-4, A[4]=0, A[5]=0, A[6]=0, A[7]=0, A[8]=0, A[9]=2 ... ... а закончим массивом A[2] = 0, A[3]=0, A[4]=0, A[5]=0, A[6]=0, A[7]=0, A[8]=0, A[9]=n (т.е. числом содержащим n девяток) Ну в данном случае нам подойдёт только последный массив, остальные (n/2 штук) мы отбросим т.к. они недадут ни одного варианта. (внутренний цикл проверки от A[2]+A[3]+A[4]+A[5]+A[6]+A[6]+A[8]+A[9] до n. сума A для всех вариантов кроме последнего окажеться больше n) p.s. k мы разбиваем полностью. так чтобы k=(2^A[2])*(3^A[3])*(5^A[5])*(7^A[7]) (если его полностью разбить на эти числа не получиться, то тогда ответ будет 0 вариантов т.к. небудет чисел удовлетворяющих заданному условию) p.p.s. Сложнее всего будет придумать формула для подсчёта вариантов перестановок чисел. Я сам пока приблезительно представляю её вид, нужнобудет в интернете поискать из чего её можнобудет вывести. p.p.p.s. В принцепе основную формула нашел. Надо начинать из комбинаторной формулы для перестановок с повторениями. И немного модифицировать её (это изза 0 в начале числа). Если соберётесь делать программу могу помочь вывести.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает." Последний раз редактировалось val_nnm; 07.11.2011 в 18:04. |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 18.10.2009
Сообщений: 185
|
![]()
Вот решил для истории написать программу.
Реализовал на C# может ктонибуть переведёт на C. В своём верхнем посте забыл про цикл по восьмёркам. (в программе поправленно) Для расчёта того, сколькими вариантами можно уложить числа. Делаем цикл I = A[2]+A[3]+A[4]+A[5]+A[6]+A[6]+A[8]+A[9] .. n Т.е. число начинаеться с n-I нулей. Чтобы заполнить оставшуюся часть добавляем еденици A[1] = I - A[2]+A[3]+A[4]+A[5]+A[6]+A[6]+A[8]+A[9] . Дальше расчитываем количество вариантов «Перестановки с повтрениями» D= (A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[6]+A[8]+A[9])!/ A[1]!*A[2]!*A[3]!*A[4]!*A[5]!*A[6]!*A[6]!*A[8]!*A[9]! Но для ускорения в программе записал её в рекурентном виде. A[1][i+1] = A[1][i]+1 D[i+1] = D[i]*(i+1)/A[1][i+1] В результате получилась вот такая программа. Она счтает и оптамальным методом и методом прямого перебора (для прямого перебора n>8 лучше не задовать, будет работать слишком долго) Также для ускорения, сделал таблицу факториалов от 0 до 10 и занёс её в массив (чтобы каждый раз не пересчитывать) Код:
а если исключить числа начинающиеся с 0. (т. е. n=2 k=4 даст числа 22 41 14) тогда Код:
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает." Последний раз редактировалось val_nnm; 08.11.2011 в 00:58. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
C. Задача на комбинаторику | _zaq357 | Помощь студентам | 0 | 25.10.2011 22:17 |
Задача на комбинаторику | Rad-X | Помощь студентам | 1 | 13.02.2011 17:18 |
помогите с задачей на комбинаторику | Alex26RusLink | Помощь студентам | 5 | 27.10.2009 21:22 |