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.
A gdzie się walnąłes? Pokaż... :P
"Proszę napiszcie mi taki program." - Off-topic -> Praca. Gotowca ci nikt nie napisze
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;
}
Nie powinieneś zerować w?
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,
Jak próbuję go skompilować wyskakuje mi a.exe has stopped working. Możecie sprawdzić ten pomysł?
#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>
#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.
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ć ?
Ten działa, tylko że if 1844674407370955161518446744073709551615/2 trwa długo.
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?
Ale to bada maksymalny zakres uns long long int?
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.