Fórum analise combinatoria #398654
03/04/2011
0
boa noite pessoal, estou precisando de um codigo sobre analise combinatoria
peguei um codigo na net, mais ele so funciona até 10 numeros dai para fente ele dá erro.
o codigo é de alexandre crivellaro, e foi pego ai mesmo no dev media, mais não estou conseguindo fazer com que ele gere sequencias acima de 10 numeros. se alguém puder olhar ou o proprio alexandre , agradeço muito
procedure next_combination (pos: integer);
begin
if (pos = 0) then Exit;
inc (combination[pos]);
if (combination[pos] > max_values[pos]) then begin
next_combination (pos - 1);
combination[pos] := combination[pos - 1] + 1;
end;
end;
Interface com o usuário
A
interface do programa é bem simples e pede três parâmetros: os valores
de N e K e os valores que queremos fazer as combinações. Por exemplo,
podemos usar nomes de times de futebol para preparar uma tabela de jogos
ou números da Mega Sena. Enfim, qualquer tipo de informação numérica ou
textual. Veja Figura 2.
Figura 2. Interface com o usuário
Abaixo segue a listagem completa do programa, veja Listagem 1.
Listagem 1. Descrição da listagem
unit binomial_generator;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TfrmGenerator = class(TForm)
...
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmGenerator: TfrmGenerator;
N, K: Integer;
values: Array [1..100] of string;
max_values: array[1..100] of Integer;
combination: array[1..100] of Integer;
procedure generate (N, K: Integer);
implementation
{$R *.dfm}
//------------------------------------------------------------------------------
procedure TfrmGenerator.Button1Click(Sender: TObject);
var s: String;
i: Integer;
begin
N := StrToInt (Edit1.Text);
K := StrToInt (Edit3.Text);
s := Edit2.Text;
s := s + ',';
for i := 1 to N do begin
values[i] := Copy (s, 1, Pos(',', s)-1);
delete (s, 1, Pos(',', s));
end;
for i := 1 to K do begin
max_values[K-i+1] := N-i+1;
combination[i] := i;
end;
generate (N, K);
end;
//------------------------------------------------------------------------------
procedure next_combination (pos: integer);
begin
if (pos = 0) then Exit;
inc (combination[pos]);
if (combination[pos] > max_values[pos]) then begin
next_combination (pos - 1);
combination[pos] := combination[pos - 1] + 1;
end;
end;
//------------------------------------------------------------------------------
function fat (n: Integer):Integer;
var i: Integer;
begin
Result := 1;
for i := 2 to n do
Result := Result * i;
end;
//------------------------------------------------------------------------------
procedure generate (N, K: Integer);
var n_comb, i, j: Integer;
f: TextFile;
s: String;
begin
n_comb := fat (N) div (fat(K) * fat(N-K));
ShowMessage ('Number of Combinations: ' + IntToStr (n_comb));
Screen.Cursor := crHourGlass;
AssignFile (f, ExtractFilePath (ParamStr (0)) + 'out.csv');
ReWrite (f);
for i := 1 to n_comb do begin
s := '';
for j := 1 to K do
s := s + values[combination[j]] + ';';
WriteLn (f, s);
next_combination (K);
end;
CloseFile (f);
Screen.Cursor := crDefault;
end;
end.sucesso a todos
geraldo
Geraldo Leal
Curtir tópico
+ 0Posts
25/04/2011
Geraldo Leal
grato
geraldo leal
Gostei + 0
26/04/2011
Assis Ferreira
grato
geraldo leal
Gostei + 0
26/04/2011
Wilson Junior
Aguardo retorno.
Gostei + 0
26/04/2011
Geraldo Leal
acontecendo neste codigo ai, é que ele somente gera numeros até 7 ou 8 combinações de 10 ou 11 se
passar ele da o resultado 0 e eu preciso que ele gere por exemplo. o jogo da lotofacil. que tem 25 numeros
vamos dizer que quero combinar 15 numeros em um total de 18 ou seja, se eu acertar os 15 numeros no meio
dos 18 eu ganho. e preciso da possibilidade de que ele faça o seguinte. se eu acertar 15 numeros nos 18
eu tenho garantido 15 ou 14 ou 13 porque quando eu escolho garantia de 14 acertos, os cartões são muito menos
na combinação.
obrigado pelo retorno seu e do outro amigo ai.
sucesso
geraldo leal
Gostei + 0
26/04/2011
Geraldo Leal
este link, esta este codigo que postei. o mesmo é do alexandre.
porem não consegui contato com ele
obrigado pelo retorno seu e do outro amigo ai.
sucesso
geraldo leal
Gostei + 0