Kezdőoldal » Számítástechnika » Programozás » Szükségem lenne egy olyan...

Elektromágnes kérdése:

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?

Figyelt kérdés
2011. aug. 17. 13:45
 1/7 anonim ***** válasza:

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...

2011. aug. 17. 14:25
Hasznos számodra ez a válasz?
 2/7 anonim ***** válasza:

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

2011. aug. 17. 14:30
Hasznos számodra ez a válasz?
 3/7 anonim ***** válasza:

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

2011. aug. 17. 14:37
Hasznos számodra ez a válasz?
 4/7 anonim ***** válasza:

#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++ :)

2011. aug. 17. 15:00
Hasznos számodra ez a válasz?
 5/7 anonim ***** válasza:
A num változó persze elromlott a gyk miatt, az 24 darab 5 és a végén egy darab hatos.
2011. aug. 17. 15:01
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:

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.

2011. aug. 19. 12:14
Hasznos számodra ez a válasz?
 7/7 A kérdező kommentje:
Köszi a programokat :D
2011. aug. 19. 15:20

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!