Acil yardım C'de

Matella
18-12-2010, 21:02   |  #1  
OP Taze Üye
Teşekkür Sayısı: 0
7 mesaj
Kayıt Tarihi:Kayıt: Ara 2010

500 den küçük asal sayılardan rakamları toplamı tek olanları yazdıran c programnı yazınız

muh34
18-12-2010, 22:40   |  #2  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

Yukarıdaki soruda ilk olarak 2 sayısından itibaren asal sayı tespiti yapılmalıdır.Ayrıca sayının asal oldugunun belirlenmesinin ardından,rakamları toplamının tek mi ? veya cift mi oldugu belirlenmelidir.Şayet rakamları toplamı tek ise ekranda bir output fonksiyonu ile ilgili deger bastırılacaktır.Algoritmanın kaba kodu(pseudo code) su sekilde betimlenirse;

 for(2'den 500'e kadar sayılari ele al) {
 for(asal carpanlar icin ikinci bir for loop) {
 if(asal mi Degilmi ?) {}
}
if(Eger sayı asal ise && rakamlari toplamı tek ise)
printf("%d",sayi);
Şeklinde olabilir.
O halde yukarıdaki algoritmanın C dilindeki karsılıgı asagıdaki gibi olacaktır.

#include <stdio.h>
#include <conio.h>

int main() {

       int flag=0,i,j;
       for(i=2;i<500;i++) { 
       for(j=2;j<i/2;j++) 
       if(i%j==0)  {
       flag=1;
       break;
       }
       if(flag==0 && (((i%10)+((i%100)/10)+(i/100)) % 2) == 1) 
       printf("%d ",i);
       flag=0;
       }            
       getchar();
       return 0;
       }

Başarılar

Matella
18-12-2010, 22:49   |  #3  
OP Taze Üye
Teşekkür Sayısı: 0
7 mesaj
Kayıt Tarihi:Kayıt: Ara 2010

çok teşekr ederim

Kapalı Hesap (153535)
23-12-2010, 02:02   |  #4  
Kapalı Hesap
Teşekkür Sayısı: 27
2,297 mesaj
Kayıt Tarihi:Kayıt: Eki 2009

for(i=2;i<500;i++) { 
       for(j=2;j<i/2;j++) 

if(flag==0 && (((i%10)+((i%100)/10)+(i/100)) % 2) == 1) 
Bu kodların mantığını anlayamadım açıklayabilir misiniz acaba?

muh34
23-12-2010, 02:20   |  #5  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

iç içe for döngüleri(nested for loops) ilgili iterasyondaki sayının asal olup olmadıgını test etmek icin tasarlanmıştır.Karar asaması ise flag degiskeni(variable) ile belirlenmektedir.Şayet sayı asal ise flag=1,aksi takdirde flag=0 olacaktır.Soruda sayıların hem asal olup,hem de rakamları toplamı tek olması istendigi icin,if kosulu icerisinde & (and) operatorlerinin yardımıyla,rakamları toplamının modul(2)'si,yani çift mi ? degil mi ? oldugu saptanmaktadır.Şayet dogru ise(true situation) if kosulu icerisine girerek işletime devam edecektir.Ayrıca,bahsedilen durum icin,yukarıdaki i%10 gibi ifadeler ise sayının rakamlarını ayırt etmeye yonelik bir girisimdir.Ancak bu sayede rakamların toplamı hakkında bir fikir sahibi olabiliriz.

birler basamagı -> i % 10
onlar basamagı -> (i%100)/10
yuzler basamagı -> i/100

Başarılar

Kapalı Hesap (153535)
23-12-2010, 02:29   |  #6  
Kapalı Hesap
Teşekkür Sayısı: 27
2,297 mesaj
Kayıt Tarihi:Kayıt: Eki 2009

Döngülerin asal sayıyı bulmak için tasarlandığını anladım ama mantığını anlayamadım.Mesela ikinci döngüdeki i/2 değeri neye eşittir?Yani ikinci döngüde, ilk döngüdeki 1 den 500 e kadar yinelenen sayılar tek tek tek çevrime mi giriyor? 

muh34
23-12-2010, 09:10   |  #7  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

Ilk dongu (2 to 500) test edilecek sayılarını belirtiyor,içteki dongu ise,asal carpanlari simgeleyen dongudur.Bir sayının asal olup olmadıgını anlamak icin dongu kosul degerini sayının yarısına kadar goturmek yeterlidir,hatta sayının kareköküne kadar gitmesi bile daha optimum bir sonuctur.Dolayısıyla icteki dongu kosulunun i/2 ' e kadar gitmesinin sebebide budur.Ornegin test sırası 8 de iken(i=8),alttaki dongude 8 sayısı yarısına kadar test edilir.Bu test edilen sayılara asal carpanlar denmektedir.(2 3 4)
Sonuc olarak bu carpanlardan herhangi birine bolundugu anda test durdurularak sayının asal olmadıgına karar verilir.
 
Başarılar

Son Düzenleme: muh34 ~ 23 Aralık 2010 09:16