Bilmece Bildirmece (2)

Bu başlık kilitlidir. Yeni mesajlar gönderilemez veya mevcut mesajlar düzenlenemez.
hasanyasin
12-03-2004, 02:02   |  #1  
OP Yıllanmış Üye
Teşekkür Sayısı: 0
1,100 mesaj
Kayıt Tarihi:Kayıt: Oca 2004

Yeni bir sorumuz geliyor arkadaşlar; buna bakmadan önce ilk Bilmece Bildirmece konusunu mutlaka okuyun. Bunu orada da yararlanacağınız bir şeyler olduğu için tavsiye ediyorum, yanlış anlaşılmasın; bu soruyu çözebilmek için onu çözmüş olmak, ya da orada ortaya çıkan şeyden haberdar olmak gerekmiyor...

Sorumuz mükemmel sayıları bulan bir program. Mükemmel sayı dediğimiz şey, çarpanlarının toplamına eşit olan sayı. Çarpan dediğimiz şey de, bir sayıyı tam bölen sayılar. Örnek vereyim efendim:

6 sayısı ilk mükemmel sayı. 6'ya tam bölünen sayılar: 1,2 ve 3. Bunların toplamı da 6 ediyor.
28 sayısı, ikinci mükemmel sayı. 1,2,4,7,14 sayıları, 28'in çarpanları ve toplamları da 28.

Bizim programımız da, verilen bir sayıdan küçük mükemmel sayıları listeleyecek. Ne de güzel değil mi? Mükemmel bir program...

Haydi bakalım, cevapları bekliyorum. Bu arada nedense, C++ öğrenmek isteyen arkadaşlar birden ortadan kayboldular. Her gün sorular soruluyordu, ne güzel şeyler yapılıyordu, small_ticket'la baş başa kaldık. Gülümseme

Son Düzenleme: hasanyasin ~ 12 Mart 2004 02:17
Banned
12-03-2004, 03:34   |  #2  
Banlandı
Teşekkür Sayısı: 0
64 mesaj
Kayıt Tarihi:Kayıt: Oca 2004

[ Tüm kodu seç ] [ Yeni Pencerede Göster ]
#include <iostream> #include <cmath> using std::cout; using std::cin; using std::endl; bool isPerfectNumber(int); int main() { int no; int count=0; cout<<"Enter A Number : "; cin>>no; for(int k=0; k<no; k++) { if(isPerfectNumber(k)) { cout<<k<<endl; count+=1; } } if(count==0) cout<<"There is not any Perfect Number..."<<endl; else cout<<"There is "<<count<<" Perfect Number..."<<endl; return 0; } bool isPerfectNumber(int number) { int sum=0; if(number<=1) return false; for (int i=2; i< sqrt(number); i++) { if(number%i==0) sum+=(i+(number/i)); } if(sum==(number-1)) return true; else return false; }
Perfect Number bulma işlemi belki daha efektif olabilir. bu program o sayıya kadar olan bütün sayılara tek tek bakıyor. Zamann kaybı. Biraz uğraşayım onun da daha hızlı şekilde bulması sağlanabilir...

hasanyasin
12-03-2004, 11:45   |  #3  
OP Yıllanmış Üye
Teşekkür Sayısı: 0
1,100 mesaj
Kayıt Tarihi:Kayıt: Oca 2004

Tebrikler un4given,
isPerfectNumber fonksiyonun gerçekten de başarılı. Yeni öğrenenlerden biri olmasan da, cevabından memnuniyet duyduğumu belirtmek isterim. Her ne kadar fonksiyon tüm sayıları tek tek kontrol ediyor diye tevazuu göstersen de, aslında oldukça akıllı:

Mesela 36'yı deneyelim. 36'nın çarpanları, 1,2,3,4,6,9,12,18 ve 36. Mükemmel sayıyı hesaplarken, 1'i ekliyoruz; fakat sayının kendisini toplam dışında tutuyoruz, eğer eklesek, zaten mükemmel sayı olmazdı değil mi..? Sen bu 1'i sonradan ilave etmişsin; çok güzel. Peki araya baktığımız zaman ne görürüz:

1,2,3    6   9,12,18

6'nın ortada olduğu bir simetri var değil mi? Sol ve sağdan eşit uzaklıktaki sayıların çarpımı, 36 ediyor; yani 36'nın çarpanlarını, 36'nın karesine kadar geldikten sonra, tek tek aramamıza gerek kalmıyor. Bunu dikkate almadan yazılabilecek bir döngüde 2-35 arası ya da en akıllıca 2-18 arası kontrol edilecekti. Burada sadece 2-6 arası kontrol ediliyor. Ne de güzel değil mi?

Herkesin gördüğü gibi, programcıların sahip olması gereken temel özelliklerden biri, "kalıp"ları [pattern] hemen kavrayabilmek. Bir yapı içindeki tekrarları, temel parçaları keşfedebilmek. Peki acaba bu yapımızda, Ümit'in [un4given] bahsettiği ve yapmak istediği, daha da az çalışarak aynı sonucu üretebilen bir fonksiyon yazılabilir mi?

Haydi bakalım, heyecanla bekliyorum... Gülümseme

Banned
12-03-2004, 15:31   |  #4  
Banlandı
Teşekkür Sayısı: 0
64 mesaj
Kayıt Tarihi:Kayıt: Oca 2004

c++ ı yeni öğrenenlerden biriyim. yalnız ilk öğrendiğim p.dilinin JAVA olması ve JAVA nın c++ a çok benzemesi nedeniyle çok zorlanmadım. ilk göz ağrım olmasından mıdır nedir JAVA yı cok seviyorum. bazen programları JAVA da yazıp c++ a sonradan cevirdiğim bile oluyor :)

hasanyasin
12-03-2004, 18:39   |  #5  
OP Yıllanmış Üye
Teşekkür Sayısı: 0
1,100 mesaj
Kayıt Tarihi:Kayıt: Oca 2004

İlerledikçe C++'ı çok daha fazla seveceğinden eminim. Zira, her zaman orjinal olan, taklitinden daha çok sevilir...

Bu bilmecemize daha güçlü bir algoritma gelebilecek mi acaba; çok merak ediyorum... Gülümseme