[C++ na C] liczby pseudolosowe

Cześć mam mały programik do zrobienia na zajęcia i znalazłem gotową wersję w C++ jednak mam problem z przekładem na C

Mam nadzieję że ktoś pomoże choć w części i wytknie błędy

Oryginał

#include 

#include 

#include 

#include 

#include 


using namespace std;


typedef unsigned long long ulong;


ulong NWD(ulong a, ulong b)

{

  ulong t;


  while(b)

  {

    t = b; b = a % b; a = t;

  }

  return a;

}


int main()

{

  ulong m,a,c,x,d,g;


  srand((unsigned)time(NULL));

  cin >> x;

  m = x + 1;

  do c = rand() % m; while(NWD(m,c) != 1);

  a = 1; x = m; d = 2; g = (ulong)sqrt(m);

  while(d <= g)

  {

    if(x % d == 0)

    {

      a *= d;

      do x /= d; while(x % d == 0);

    }

    if(d == 2) d++; else d += 2;

    if(x < d) break;

  }

  a *= x;

  if(m % 4 == 0) a <<= 1;

  a++;

  cout << "m = " << setw(12) << m << endl

       << "a = " << setw(12) << a << endl

       << "c = " << setw(12) << c << endl

       << endl;

  return 0;

}

moja przeróbka niedziałająca

#include 

#include 

#include 

#include 


typedef unsigned long long ulong;                  


ulong NWD(ulong a, ulong b)

{

  ulong t;


  while(b != 0)                                            

  {

    t = b; 

    b = a % b; 

    a = t;

  }

  return a;

}

int main()

{

  int m,a,c,x,d,g,x0;

    srand((int)time(0));

  scanf ("%i\n", x);

  scanf ("%i\n", x0);

  m = x + 1;

      do 

  c = rand() % m; 

  while(NWD(m,c) != 1);

  a = 1; x = m; d = 2; g = (ulong)sqrt(m);

    while(d <= g)

  {

    if(x % d == 0)

    {

      a *= d;

      do x /= d; 

      while(x % d == 0);

    }

    if(d == 2) d++; else d += 2;

    if(x < d) break;

  }

     a *= x;

   if(m % 4 == 0) 

  a <<= 1;

    a++; 

    printf ("m= " "%i\n", m);       

  printf ("a= " "%i\n", a);

  printf ("c= " "%i\n", c);   

  system("PAUSE");	

  return 0;

}

Oryginał i opis działania pochodzi ze http://edu.i-lo.tarnow.pl/inf/alg/001_search/0019.php i jest to program wyliczający współczynniki addytywnego generatora LCG na podstawie maksymalnej liczby pseudolosowe Xmax

Z góry dzięki :smiley:

I z czym masz problem? Poza tym, że scanf przyjmuje wskaźniki na int, a nie int (linia 25 i 26).

Tak na marginesie, czemu drugi kod nie wygląda tak jak pierwszy pod względem formatowania? Aż nie chce mi się wierzyć, że podczas przepisywania kodu można aż tak zepsuć czytelność…

Problem jest prosty - nie znam się na języku C ani na C++ a to co przepisałem jest efektem tego co przeczytałem na internecie :frowning: .

Co do podpowiedzi poprawy to nie rozumiem jej - wybacz. Czy mogę prosić o napisanie poprawnej składni? Nadal program mi się wysypuje?

W działanie kodu się nie zgłębiałem, jedyne co widać od razu to

scanf ("%i\n", x);

\scanf ("%i\n", x0);

scanf przyjmuje wskaźnik, więc trzeba użyć operatora &, który daje wskaźnik obiektu

scanf ("%i\n", &x);

  scanf ("%i\n", &x0);

Dzięki ‘scanf’ działa ok tylko zamiast pobierać 2 liczby konsolka prosi o 3, ta nadprogramowa liczna nie wpływa na wynik, ale jednak nie wiem skąd to żądanie?

W scanf daj “%i”, bez żądania nowej linii po liczbie - stąd to pozorna prośba o 3 liczbę - tak naprawdę czeka na znak nowej linii (o ile dobrze pamiętam działanie scanf).

Sawyer Bardzo dziękuję za pomoc. Zawsze miałem problem z kruczkami :slight_smile:

Gdyby ktoś potrzebował generatora liczb pseudolosowych w C połączonym z programem wyliczającym współczynniki addytywnego generatora LCG na podstawie maksymalnej liczby pseudolosowej Xmax i ziarna Xo to podaję mój efekt:

#include 

#include 

#include 


/* podstawowy algorytm liczący Xn = (a × Xn-1 + c) mod m 


 Xn - n-ta liczba pseudolosowa

Xn-1 - poprzednia liczba pseudolosowa

a - mnożnik

c - przyrost

m - moduł  

*/              


int NWD(int a, int b)

{

  int t;


  while(b != 0)                                            

  {

    t = b; 

    b = a % b; 

    a = t;

  }

  return a;

}

int main()

{

  int m,a,c,x,d,g,x0;


  printf ("Podaj wartosc maksymalnej liczby pseudolosowej Xmax""\n");

  scanf ("%i", &x);

  printf ("Podaj poczatkowa wartosc ziarna X0""\n");

  scanf ("%i", &x0);


  m = x + 1;

  do c = rand() % m; while(NWD(m,c) != 1);

  a = 1; x = m; d = 2; g = (int)sqrt(m);

  while(d <= g)

  {

    if(x % d == 0)

    {

      a *= d;

      do x /= d; while(x % d == 0);

    }

    if(d == 2) d++; 

    else d += 2;

    if(x < d) break;

  }

  a *= x;

  if(m % 2 == 0) a <= 1;

  a++;

  printf ("0liczone wspolczynniki: ""\n");

  printf ("modul m= " "%i\n", m);       

  printf ("mnoznik a= " "%i\n", a);

  printf ("przyrost c= " "%i\n", c);       


 printf ("0bliczone liczby pseudolosowe: ""\n");    

     x = x0; 

 do

  {

    x = (a * x + c) % m;

    printf (" "" %i\n", x);   

  }

   while(x != x0);  


       system("PAUSE");

  return 0;

}