Szlachetny Panie,
Ja, Królowa z ludu, prosta chłopka wywyższona przez Jaśnie Króla, śmiem twierdzić, że będzie to trudne zadanie, ale dzięki ciężkiej, mozolnej pracy, będą ludzie z Królewicza, oczywiście z pomocą dobrego guwernanta.
[C++] Liczby doskonałe
-
- Użytkownik
- Posty: 97
- Rejestracja: 19 lut 2011, o 21:23
- Płeć: Kobieta
- Lokalizacja: Biegun Północny
[C++] Liczby doskonałe
Z pewnością należy wspomnieć o szukaniu z definicji jakby, tzn. sumując dzielnikiW miarę szybko znajdziemy pierwsze 4 doskonałe, lecz czekając na kolejne będzie można oglądać jak Królewiczowi rośnie broda, po czym zaczyna siwieć po czym....
algorytm może wyglądać tak:GRANICA to zależy ile mamy cierpliwości, dla 60 to chwila, ale 61 (czyli pierwsza Mersenne'a) trwa już chyba koło kwadransa.
c.d.n
Kod: Zaznacz cały
naiwny(){
int s,n,d;
for(n=2; n<=10000; n++){
s=1;
for(d=2; d<=n/2; d++)
if( n%d==0 )
s+=d;
if(s==n)
printf("%d ", n);
}
}
algorytm może wyglądać tak:
Kod: Zaznacz cały
for(p=2; p<=GRANICA; p++)
if( isprime((1LL<<p)-1) ) // 2^p-1
pisz(p)
c.d.n
Ostatnio zmieniony 9 paź 2011, o 10:50 przez Xitami, łącznie zmieniany 1 raz.
-
- Użytkownik
- Posty: 97
- Rejestracja: 19 lut 2011, o 21:23
- Płeć: Kobieta
- Lokalizacja: Biegun Północny
[C++] Liczby doskonałe
Bingo, Panie. Aczkolwiek Królewicz zrobił sam 2 metodą, jednak coś potrafi. Chodziło tylko o 1 napisaną przeze mnie metodę.
-
- Użytkownik
- Posty: 97
- Rejestracja: 19 lut 2011, o 21:23
- Płeć: Kobieta
- Lokalizacja: Biegun Północny
[C++] Liczby doskonałe
Oczywiście!
Kod: Zaznacz cały
void dosk(void){
for(int i=2;i<=10000;i++){
int s=1;
for(int j=2;j<=i/2;j++){
if(i%j==0){
s+=j;
}
}
if(s==i){
cout<<i<<endl;}
}
}
[C++] Liczby doskonałe
Kod: Zaznacz cały
int Suma(int n){
int s, krok, d, k;
if( n%2==0 ) {
s= 1+2+n/2; krok= 1; }
else {
s= 1; krok= 2;} // wydłużamy krok dla nieparzystych
for(k=n/3, d=3; d*d<=n; d+=krok) // szukamy tylko do pierwiastka z n, to istotne
if( n%d==0 ) {
k= n/d; // jeżeli mamy jednego to i drugiego
s += d;
if( d!=k )
s += k; // poza kwadratami
if( s>n ) // nie musimy szukać wszystkich
return 0;}
return s==n;}
main(i){
for(i=2; i<500000; i++)
if(Suma(i))
printf("%d
",i);}