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
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ść…
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
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;
}