Chcę stworzyć program który wypisuje wszystkie(jak najwięcej, bo one idą w nieskończoność) liczby doskonałe i tu mam problem bo gdzieś się walnąłem. Proszę napiszcie mi taki program.
Wypisywanie liczb doskonałych-problem
- Rejestracja: dni
- Ostatnio: dni
A gdzie się walnąłes? Pokaż... :P
- Rejestracja: dni
- Ostatnio: dni
- Postów: 260
"Proszę napiszcie mi taki program." - Off-topic -> Praca. Gotowca ci nikt nie napisze
- Rejestracja: dni
- Ostatnio: dni
Tu przesyłam mój program.Gdzie robię błąd?
#include<iostream>
using namespace std;
int main(){
unsigned long long a=2;
unsigned long long w=0;
for(;;){
for(int i=0;i<a;i++){
if(a%i==0){
w=w+i;
}
}
if(a==w){
cout <<a<<endl;
}
a++;
}
system("pause");
return 0;
}
- Rejestracja: dni
- Ostatnio: dni
W IX księdze Elementów Euklides podał sposób znajdowania liczb doskonałych parzystych: należy obliczać sumy kolejnych potęg dwójki np. 1 + 2 + 4 + 8 +... Jeżeli któraś z otrzymanych sum okaże się liczbą pierwszą, należy pomnożyć ją przez ostatni składnik i otrzymamy liczbę doskonałą.
Jak dotąd nie udało się znaleźć liczby doskonałej nieparzystej,
- Rejestracja: dni
- Ostatnio: dni
Jak próbuję go skompilować wyskakuje mi a.exe has stopped working. Możecie sprawdzić ten pomysł?
- Rejestracja: dni
- Ostatnio: dni
#include <stdio.h>
unsigned long long int s,n1;
unsigned int p,i,n;
int main(){
p =2;
n =3; // n== 2^p - 1
n1=2; // n1*n perfect number if n is prime
do{
s=4; // 1 Lucas-Lehmer test
for(i=3; i<=p; i++) // 2
s=(s*s-2) % n; // 3
if (s==0 || p==2) // 4
printf("Mersenne prime=2^%2d-1=%10d, perfect number %20llu\n", p, n, n1*n);
p++;
n1=n+1;
n=2*n+1;
}while (p<32);
return(0);
}</CODE>
Output
Mersenne prime=2^ 2-1= 3, perfect number 6
Mersenne prime=2^ 3-1= 7, perfect number 28
Mersenne prime=2^ 5-1= 31, perfect number 496
Mersenne prime=2^ 7-1= 127, perfect number 8128
Mersenne prime=2^13-1= 8191, perfect number 33550336
Mersenne prime=2^17-1= 131071, perfect number 8589869056
Mersenne prime=2^19-1= 524287, perfect number 137438691328
Mersenne prime=2^31-1=2147483647, perfect number 2305843008139952128</CODE>
- Rejestracja: dni
- Ostatnio: dni
- Postów: 260
#include<iostream>
using namespace std;
int main()
{
unsigned long long a;
unsigned long long w;
for(a = 2; a > 18446744073709551615; a+=2)
{
w = 0;
for(unsigned long long int i=1; i<a=/2; i++)
{
if(a%i==0)
{
w+=i;
}
}
if(a==w)
{
cout <<a<<endl;
}
}
return 0;
}
Przeszukuje cały rozmiar uns long long int'a.
PS. Bez optymalizacji.
- Rejestracja: dni
- Ostatnio: dni
Program prawie działa ale wypisuje liczby doskonałe tylko do ok. 8130. Wygląda jakby coś liczył ale po odczekaniu nadal nic. Jak tu naprawić ?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 260
Ten działa, tylko że if 1844674407370955161518446744073709551615/2 trwa długo.
- Rejestracja: dni
- Ostatnio: dni
main(){
int k,i,w=1,n=33550336;
for(k=0;k<100;k++)
for(i=2;i<n;i++)
if(n%i==0) w+=i;
printf("%d %d\n",n,w/100);
return 0;
}
Ile czasu zajmuje wykonanie tego programu?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 260
Ale to bada maksymalny zakres uns long long int?
- Rejestracja: dni
- Ostatnio: dni
Tu sprawdzamy 100 razy czy pewna konkretna liczba jest doskonała.
Robimy to po to by zastanowić się ile czasu zajmie dotarcie do tej liczby sprawdzając wszystkie po kolei.
A to dopiero piąta taka liczba (znamy ich tylko 47).
A kolejna jest ponad 100 razy większa.
Nawet ten proponowany przez was algorytm da się przyśpieszyć.
Może nawet dziesiątki tysięcy razy bez wnikania w poważną matematykę (znaną od ponad dwu tysiącleci)
Chętnie pogadam gdyby był ktoś zainteresowany.