PDA

Tam Sürümünü Görmek İçin : girilen 2 deger arasindaki mükemmel sayilar??


SLiM_BoY
15/12/2004, 12:39
beyLer giriLen 2deger arasindaki mükemmeL sayiLAri yazdiran bi program yazmam Lazim..Sizden programin bütün kodunu istemiyorum..Sadece mantigini anLasam yeter bana..6tane ödev var..KitLendim kaLdim..yarin 1 tane sinav var :D hangisine çaLisacam biLmiyorum vaLLa..Cuma ya 6 tane ödev var iste :D

yardim edenLEre simdiden tesekkürLEr..


acehreli
15/12/2004, 21:42
C ile yazacagini varsayiyorum...

Oncelikle verilen sayinin mukemmel olup olmadigini donduren bir islev yazman gerekiyor:

int mukemmel(int sayi)
{
/* ... */
}

O islev, sayi mukemmelse 0'dan farkli bir deger, mukemmel degilse 0 dondursun...

Ondan sonra, o islevi bir dongu icinde cagiracaksin. "Dongu" dedigime gore for dongusunu dusunebilirsin.

Eger donus degeri 0'dan farkliysa yazdiracaksin. "Eger" dedigime gore de if kosulu kullanacaksin.

Aslinda kucuk bir program sayilir:

1) Dongu sInIrlarini bir sekilde ogreneceksin. (argv veya scanf yontemlerini kullanabilirsin.)
2) for dongusu isleteceksin
3) if kosulu uygulayacaksin
4) mukemmel adli islevi cagiracaksin

Ali

SLiM_BoY
15/12/2004, 22:00
işte sayının mükemmel olup olmadığını kontrol ederken biraz kasıyor :) yani bölenlerinin toplamı kendisine eşit olduğunu nasıl yapacağım?
if(sayi==bolen)
bolen+=bolen

türü bir şey mi yapmam lazım??

acehreli
16/12/2004, 03:42
Simdi mukemmel adli islevi konusuyoruz...

if(/* bolen sayiyi tam boluyorsa */) gibi bir mantik olacak.

Ayrica, 'bolen += bolen' olmaz tabii. Herhalde 'toplam += bolen' olur.

Bence bir for dongusunu 1'den sayi-1'e kadar isleteceksin. (Aslinda sayi'nin yarisina kadar isletmen yeter cunku bir sayinin kendi yarisindan daha buyuk tam boleni olamaz.)

Eger for dongusunde kullanilan degisken sayiyi tam boluyorsa o degiskenin degerini toplama ekleyeceksin. (Tam bolup bolmedigini anlamak icin % islecinden yararlanabilirsin.)

Sonunda da toplam sayi'ya esitse 1, degilse 0 dondureceksin.

Ali

Euclides
16/12/2004, 13:37
Kolay yol
eğer p bir Mersenne asalı ise
[2^(p-1)]*[(2^p) - 1] mükemmeldir :)
bu asallar zaten bellidir(hatta bir sonrakini bulana 10mil$ ödül veriyordu bir vakıf ??)

En yavaş yol:
önce 1'den o 2 sayıdan büyüyüne kadar olan asal sayıları bulursun.
(Pek asal sayıları nasıl bulursun ?
"Kendinden küçük asal sayılara tam bölünmeyen her sayı asaldır" dersin
veya
geçenlerde 2-3 hitlinin bulduğu polinom zamanda bir sayının asal olup olmadığını veren algoritmayı araştırısın)

Sonra aradaki sayıları çarpanlarına ayırır.
Teker teker bakarsın

FAKAT
Mükemmel sayıları çok çok azdır.
örneyin ilk 10ayı
6
28
496
8128
33550336
8589869056
137438691328
2305843008139952128
2658455991569831744654692615953842176
19156194260823610729479337808430363813099732154816 9216


Eğer son 3 sayıya dikkatlice bakarsan 18 haneden fazla olduğunu görürsün
yani bu sayıları default math lib ile hesaplayamazsın

SLiM_BoY
16/12/2004, 14:41
Beyler girilen 2değer arasındaki değilmiş..Girilen sınır değeri arasındaki mükemmel sayıları bulacakmış :) yani 0 la mesela 239489 arasındaki mükemmel sayıları bulacak..Başlangıç 0 yani :)

@acehreli; "if(/* bolen sayiyi tam boluyorsa */) gibi bir mantik olacak." demişsin..fakat boleni ne alacağım??

SLiM_BoY
16/12/2004, 15:47
#include <stdio.h>
int main()
{
int sinir,bolen,toplam;
printf("sinir degerini giriniz");
scanf("%d", &sinir);
bolen=1;
toplam=1;
while(bolen<=sinir && toplam<=sinir)
{
if(sinir%bolen==0 && toplam<=sinir)
printf("%d\n", toplam);
bolen++;
toplam+=bolen;
}
getchar();
getchar();
return 0;
}
-------------------------------
bunda mükemmel sayı olduğunu doğruluyorum..fakat girilen değer arasındakileri yazdıramadım bi türlü :)
yardım ederseniz sevinirim..

Euclides
16/12/2004, 17:17
sen kasma slim_boy
boşver...
sal kendini yeşile...

acehreli
16/12/2004, 18:36
SLiM_BoY, verdigin satirlar arasinda mukemmel sayi mantigini hangi islemlerin gerceklediklerini goremiyorum.

Neden mukemmel adinda bir islev yazmadin? O fikrime katilmiyorsan tartisalim... Yoksa bu programi kendine gucluk cikartarak yazman mi gerekiyormus? :)

Ali

SLiM_BoY
16/12/2004, 22:23
Bi dene istersen 28 girmeyi..daha sonra da 30 gir bakalım..mükemmel sayıyı yazdırıyor mu,yazdırmıyor mu...
@Euclides,karşında insan olduğunu unutma..Herkesi kendin gibi de yeşilci sanma !!

Yardım istiyoruz..Cevaplar bu şekilde olacaksa bin pişman etmeyin insanı..

Arkantos
17/12/2004, 00:54
Bu sorunun 4. şıkkını şöyle yapabilirsin. Mükemmel sayı işlevi sayı mükemmelse sayıyı değilse 0 döndürüyor:


#include <iostream>
using std::cout;

int mukemmelsayi (int sayi)
{
int toplam = 0;
for (int bolen = 0; bolen < sayi; ++bolen)
{
if (bolen != 0)
{
if ((sayi % bolen) == 0)
toplam += bolen;
}
}
return (sayi == toplam) ? sayi : 0;

}
int main ()
{
cout << mukemmelsayi (8128);
}

SLiM_BoY
17/12/2004, 10:24
Herkese yardımLarı için teşekkürLEr..Bunu haLLettim..geriye kaLdı 1-2 ödev :D