Szükségem lenne egy olyan progira pascal vagy c++ nyelven ami generál egy random 25jegyű számot amelynek a számjegyeinek összege 126. Le tudná valaki írni a programkódot?
var v:array[1..25] of byte;
i:byte;
r:byte;
procedure kiir;
var i:byte;
begin
for i:=1 to 25 do write(v[i]);
writeln;
end;
procedure back(i, s: byte);
var j:byte;
begin
if ( i = 26 ) then
kiir
else
if ( (126 - s) / (25-i+1) ) < 9 then
begin
if i=2 then j:=1 else j:=1;
for j:=j to 9 do
back( i+1, s+j );
end;
end;
Nem próbáltam ki, de ha meghivod a back(1,0) eljárást, elméletileg generálni fogja az összes lehetséges 25 számjegyű számot.
Ha neked egy random szám kell, akkor a for helyett, ami a j-vel végigmegy a számjegyeken egy j := random(9); utasítás kell. És persze a randomize a programban valahol...
procedure back(i, s: byte);
var j:byte;
begin
if ( i = 26 ) then
begin
if ( s= 126 ) then
kiir;
end
else
if ( (126 - s) / (25-i+1) ) < 9 then
begin
if i=2 then j:=1 else j:=1;
for j:=j to 9 do
begin
v[i] := j;
back( i+1, s+j );
end;
end;
end;
Javított változat... :P
procedure back(i, s: byte);
var j:byte;
begin
if ( i = 26 ) then
begin
if ( s= 126 ) then
kiir;
end
else
if ( (126 - s) / (25-i+1) ) < 9 then
begin
if i=2 then j:=1 else j:=1;
for j:=j to 9 do
begin
v[i] := random(10);
back( i+1, s+v[i] );
end;
end;
end;
Ez randommal... nem szép, de működik :P
#include <cstdlib>
#include <iostream>
const int runs = 1000;
int main()
{
char num[] = "5555555555555555555555556";
std::srand( (unsigned)time( NULL ) );
for(int i(0); i<runs; ++i)
{
int idx = std::rand() % 25;
int sum = std::rand() % (num[idx] - '0');
num[idx] -= sum;
idx = std::rand() % 25;
while(num[idx] + sum >= '9')
{
idx = std::rand() % 25;
}
num[idx] += sum;
}
std::cout << num << '\n';
}
Itt egy kicsit másfajta megközelítés, jah és C++ :)
var v:array[1..25] of byte;
sum:integer;
procedure kiir;
var i,s:byte;
begin
s:= 0;
for i:=1 to 25 do
begin
write(v[i]);
s := s+v[i];
end;
writeln;
writeln(s);
readln;
end;
function back(i: byte):boolean;
var j:byte;
begin
if ( i = 26 ) then
begin
if ( sum = 126 ) then
begin
kiir;
back := true;
exit;
end;
end
else
if ( (126 - sum) / (25-i+1) ) < 9 then
begin
if i=2 then j:=1 else j:=1;
for j:=j to 9 do
begin
repeat
v[i] := random(10)
until (i <> 1) or (v[i] <> 0);
sum := sum + v[i];
if ( back( i+1 ) = true ) then
begin
back := true;
exit;
end;
sum := sum - v[i];
end;
end;
back := false;
end;
begin
randomize;
sum := 0;
back(1);
end.
Harmadik nagyon javított változat... ez már csak egy megoldást ír ki... :D
Amúgy nagyon tetszik az előző megoldás. :) Szerintem használd azt, mivel sokkal szebb.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!