Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Помогите шулеру...

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

morozofff

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ести такая поблема,  имеется 36 карт необходимо вычислить сколько можно получить вариантов расклада  всех 36 карт.......
Для наглядности :
36 35 . . . 9 8 7 6 5 4 3 2 1      первый вариант
36 35 . . . 9 8 7 6 5 4 3 1 2      второй вариант
36 35 . . . 9 8 7 6 5 4 1 3 2      третий и т.д....
 
Хоть убейте не могу придумать алгоритм для реализации  всего этого!
 
Кто знает подскажите, в свою очередь помогу чем смогу !
 
 

Всего записей: 4 | Зарегистр. 18-08-2002 | Отправлено: 13:33 18-08-2002
mas



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Организуй два цикла - внешний выбирает индекс, внутренний перетасовывает его с другими.
Количество вариантов 36! кажется

Всего записей: 206 | Зарегистр. 08-03-2002 | Отправлено: 15:18 18-08-2002
Denchik



Двоечник
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mas

Цитата:
Количество вариантов "36!" кажется
все верно
morozofff
так тебе нужно

Цитата:
вычислить сколько можно получить вариантов расклада  всех 36 карт
или получить все эти варианты?

Всего записей: 8889 | Зарегистр. 06-02-2002 | Отправлено: 15:22 18-08-2002 | Исправлено: Denchik, 15:24 18-08-2002
morozofff

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mas

Цитата:
Организуй два цикла - внешний выбирает индекс, внутренний перетасовывает его с другими.  
Количество вариантов 36! кажется

Попробую двумя циклами, наверное именно так оно и есть, но тогда два цикла дадут  36^2=1296 варианто. А 36! это слишком уж ......
36! это гораздо большее чем 10^36, а этого быть не может .
Denchik

Цитата:
или получить все эти варианты?

Ты как в воду глядишь, именно ПОЛУЧИТЬ

Всего записей: 4 | Зарегистр. 18-08-2002 | Отправлено: 18:14 18-08-2002
kutuz

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
morozofff
Нафиг тебе получать 36! вариантов? Что ты с ними будешь делать? Сам же сказал, это ОЧЕНЬ, ОЧЕНЬ много.... Интересно, кстати, посчитать, сколько километров бумаги надо будет, если на лист А4 помещается 60 строк...
Вариантов: 371 993 326 789 901 217 467 999 448 150 835 200 000 000
Если длина А4 - 30см, то, если я нигде не ошибся, получается  0.1859966634*10^37км... Мой совет - оставь затею в покое
 


----------
Учёные подсчитали, что человек живёт в интернете 3% своего времени. По-моему, что-то у них маловато получилось...

Всего записей: 433 | Зарегистр. 05-03-2002 | Отправлено: 19:02 18-08-2002
mas



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
morozofff
 

Цитата:
но тогда два цикла дадут  36^2=1296 варианто

 
Нет - внутренний цикл будет рекурсивно вызываться 35! раз, а внешний - 36 раз.
Игру пытаешься написать, или автоматы обманывать

Всего записей: 206 | Зарегистр. 08-03-2002 | Отправлено: 19:14 18-08-2002
Denchik



Двоечник
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
morozofff
угу, для чего это надо то?
а, вообще, прислушайся к совету kutuz

Всего записей: 8889 | Зарегистр. 06-02-2002 | Отправлено: 21:17 18-08-2002
kutuz

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ладно, с 36 числами действительно чересчур много. Может найдём алгоритм для 5-7 чисел, он ведь ничем не отличается от алгоритма для 36 чисел? Пытаюсь сейчас представить нечто такое в С++, но так как я новичёк в С++ и в программировании в целом, то не откажусь от помощи. Ну какие варианты будут? Ясное дело, что через n циклов, где n - число, не подойдёт...

----------
Учёные подсчитали, что человек живёт в интернете 3% своего времени. По-моему, что-то у них маловато получилось...

Всего записей: 433 | Зарегистр. 05-03-2002 | Отправлено: 21:42 18-08-2002
Kobold



Flame monster
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что тебе надо сделать? Посчитать количество вариантов? тогда умножение в цикле от 1 до 36. Если же тебе нужно провести какую-то операцию для каждого варианта перетасовки, то єто нереально.

----------
Tanned in cathode ray sunshine

Всего записей: 1838 | Зарегистр. 11-12-2001 | Отправлено: 22:30 18-08-2002
kutuz

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Kobold
надо вывести все возможные варианты перетасовок...  


----------
Учёные подсчитали, что человек живёт в интернете 3% своего времени. По-моему, что-то у них маловато получилось...

Всего записей: 433 | Зарегистр. 05-03-2002 | Отправлено: 22:35 18-08-2002
Denchik



Двоечник
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kutuz
http://dkws.narod.ru/math/lexp.html

Всего записей: 8889 | Зарегистр. 06-02-2002 | Отправлено: 22:45 18-08-2002
kutuz

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Кхе, отыскал у друга забавную книженцию - Московские олимпиады по программированию, там за 1980 год (огого!) есть эта задачка, и вот её решение на С (есть ещё Басик, Паскаль и Фортран):
 

Цитата:
#include <stdio.h>
#define MM 100
#define PECH for (i=0;i<m;i++) printf("%d ",A[P[i]]); \
        putchar('\n');
 
int main() {
int m,i,j,k,n,P[MM],A[MM];
B: printf("Vvedite cislo: 0<m<=%d \n",MM);
scanf("%d",&m); if (m<=0 || m>MM) goto B;
for (i=0;i<m;i++) {
scanf("%d",&A[i]); P[i]=i;
}
PECH
for(;;) {  
for (i=m-2;i>0;--i)
if (P[i]<P[i+1]) goto R; return(0);
R: n=P[i]; j=m-1; while (n>=P[j] && j>i) j--;
P[i]=P[j];P[j]=n;
for (k=1;i+k<m-k;k++){
n=P[i+k]; P[i+k]=P[m-k]; P[m-k]=n;
}
PECH
}
return(0);
}

 
Конечно, не самый лучший вариант с goto, но если кому надо - переделаете...

----------
Учёные подсчитали, что человек живёт в интернете 3% своего времени. По-моему, что-то у них маловато получилось...

Всего записей: 433 | Зарегистр. 05-03-2002 | Отправлено: 23:35 18-08-2002
Dust



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
необходимо вычислить  

 
Если я правильно понял тебе нужно значение числа, а не просмотр всех возможных вариантов?
Тогда лучше обратиться к комбинаторике:
 

Цитата:
Общее количество выборок в схеме выбора k элементов из n  с возвращением и с учетом порядка определяется формулой  
       k
N= n

 

 
 


----------
http://forum.cn.ua

Всего записей: 460 | Зарегистр. 01-03-2002 | Отправлено: 00:17 19-08-2002
kutuz

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Dust
Количество возможностей уже нашли (вроде). Теперь речь идёт о реализации алгоритма, чтобы можно было именно просмотреть их всех...
 
2All
В приведённом мной листинге имеются некоторые ошибки, особо не существенные, но всё же. Завтра попробую переделать...  


----------
Учёные подсчитали, что человек живёт в интернете 3% своего времени. По-моему, что-то у них маловато получилось...

Всего записей: 433 | Зарегистр. 05-03-2002 | Отправлено: 00:40 19-08-2002
Guest

BANNED
Редактировать | Цитировать | Сообщить модератору
hi!
Морозоффф, вариантов будет 36! (факториал для 36)
 
Поясни, зачем тебе все это - "для первого класса"?  
 
Есть проги и для покера, и для блэкджека, и для префа, и для бриджа, и для спортлото, и для рулетки...
 
Удачи!
  ПВ
З.Ы.  Лучше расскажи о шуллерских приемчиках (вольт и др.)

Отправлено: 07:24 19-08-2002
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kutuz
Ну алгоритм то уже вроде тоже нашли - обыкновенная рекурсия.
 
А вообще господина Кнута читать надо - полезные книжки напсал.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 14:51 19-08-2002
dremon



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Простенькая версия:

Код:
 
#include <algorithm>
#include <iostream>
#include <cstdlib>
 
int   total_number = 0;
int*  perm = 0;
bool* used = 0;
 
void do_find(int n)
{
if (n == total_number) {
std::copy(perm, perm+total_number, std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return;
}
for (int i = 0; i < total_number; i++) {
if (!used[i]) {
       used[i] = true;
perm[n] = i;
do_find(n+1);
used[i] = false;
}
}
}
 
void find_permutations(int number)
{
total_number = number;
perm = new int [number];
used = new bool [number];
memset(used, 0, sizeof(bool)*number);
do_find(0);
}
 
int main(int argc, char* argv[])
{
if (argc != 2) {
std::cout << "usage: permutations number" << std::endl;
return 1;
}
find_permutations(atoi(argv[1]));
 
return 0;
}
 

 
А вот более продвинутая

Код:
 
#include <algorithm>
#include <vector>
#include <iostream>
#include <cstdlib>
 
inline int genproc() { static int counter = 0; return counter++; }
 
int main(int argc, char* argv[])
{
if (argc != 2) {
std::cout << "usage: permutations number" << std::endl;
return 1;
}
 
std::vector<int> perm(atoi(argv[1]));
std::generate(perm.begin(), perm.end(), genproc);
 
while (std::next_permutation(perm.begin(), perm.end())) {
std::copy(perm.begin(), perm.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
 
return 0;
}
 


Всего записей: 961 | Зарегистр. 21-08-2001 | Отправлено: 16:14 19-08-2002
morozofff

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Да 36! не шутка !  
Сколько веков люди играют и будут играть, а всех вариантов так и не получат... Даже обидно както (
Предлагаю закрыть эту тему.
 
Всем ОГРОМНОЕ СПАСИБО за обсуждение !
P.S. почитал Кнута

Всего записей: 4 | Зарегистр. 18-08-2002 | Отправлено: 23:47 06-09-2002
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Помогите шулеру...


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru