C Öğrenirken Yine Bir Yerde Takıldım (Arrays Ve Asal Sayılar )
-
Merhaba geçen açtığım konuya gelen cevaptan dolayı müteşekkirim desem yeridir. Zira başka sorabileceğim başka yer yok tahribat dışında.
Uzatmamayayım. Kodlar aşağıda ve sorum altındadır.#include<cs50.h> #include<stdio.h> #include<stdbool.h> // Modified program to generate prime numbers int main() { int p, i, primes[50], PrimeIndex = 2; bool IsPrime; primes[0] = 2; primes[1] = 3; for (p = 5; p <= 50; p = p+2) { IsPrime = true; for ( i = 1; IsPrime && p / primes[i] >= primes[i]; ++i) { if (p % primes[i] == 0) { IsPrime = false; } } if( IsPrime == true) { primes[PrimeIndex] = p; ++PrimeIndex; } } for ( i = 1; i < PrimeIndex; i++) { printf("%i ", primes[i]); } return 0; }
Output burada , düzgün çalışıyor kodlar
3 5 7 11 13 17 19 23 29 31 37 41 43 47
Şimdi soruma gelirsek:
anladığım kadarıyla çift sayıları hiç göz önüne almadan, asal sayının daha önceden üretilmiş olan asal sayılarla bölümünden kalana bakarak 50 ye kadar olan asalları yazdırıyor.
ama ikinci for loopta anlayamadığım bir yer bulunuyor:
p = 5 için içteki for i saymaya başlıyor ve i = 1 yani primes [1] = 3 ,5 / 3 >= 3 bunu sağlamadığı için içteki for loop ddevam ediyor ve prime[2] = 5 yapıp PrimeIndex'i bir arttırıyor.
devamında:7 / 3 , 7 /5,
9 / 3 , 9 / 5, 9 / 7
11 / 3, 11/ 5 , 11 / 7, 11/ 9
15 / 3, 15/ 5, 15 / 7, 15 / 9 , 15 / 11
..
..
ancak anlamadığım kısım tamda bu noktada. Mesela 15 / 3 > = 5 burada 5 >= 3 olduğu için içteki loop'un çalışmaması gerekmiyor mu? Anlayamadım mantığı. Umarım sorumu anlatabilmişimdir.
Yine çok saçma bir şey düşünüyorum galiba ama yardım bekliyorum yinede :d -
hocam for içi doğru olduğu sürece devam etmez mi dogru işte niye devam etmesin
-
işte p 15 iken i de 1 de 3 ü gösteriyor, inner loop koşulu sağlıyor.(Neden sağlamıyor dediğini anlayamadım. isPrime true, diğer koşul 15/3>=3 te doğru) içerdeki if 15 mod 3 = 0 koşulu da sağlanıyor. isPrime false çeriliyor. Dolayısıyla ikinci if e girmiyor yani 15 yeni bir prime olarak diziye eklenmiyor.
edit: kod blogu şeklinde böyle şeyleri eklerseniz iyi olur çükümsonik kodu bile okumak zaman alıyor böyle.
whopper tarafından 24/Ara/16 16:42 tarihinde düzenlenmiştir -
sercoo bunu yazdı
hocam for içi doğru olduğu sürece devam etmez mi dogru işte niye devam etmesin
for ( i = 1; IsPrime && p / primes[i] >= primes[i]; ++i)
hocam burada p değeri bölü primes[i] değeri , primes[i] değerinden büyük ve eşit olana kadar devam etmesi gerekmiyor mu? Yani p / primes[i] sonucu , primes[i] değerinden zaten büyük olduğu için durması gerekmiyor mu? Yani 15/3 = 5 büyük mesela 3'ten. Demek istediğim for' un devam etmesi için sonucun 3 den yani primes[i] 'den düşük olması gerekmiyor mu ?
-
whopper bunu yazdı
işte p 15 iken i de 1 de 3 ü gösteriyor, inner loop koşulu sağlıyor.(Neden sağlamıyor dediğini anlayamadım. isPrime true, diğer koşul 15/3>=3 te doğru) içerdeki if 15 mod 3 = 0 koşulu da sağlanıyor. isPrime false çeriliyor. Dolayısıyla ikinci if e girmiyor yani 15 yeni bir prime olarak diziye eklenmiyor.
edit: kod blogu şeklinde böyle şeyleri eklerseniz iyi olur çükümsonik kodu bile okumak zaman alıyor böyle.
ben galiba for loop mantığını tam anlayamamışım
yani condition doğru olduğu sürece mi döndür loop u diyor orada ?
Peki mesela 5/3 primes [i] den büyük değil yani 3 den büüyük değil o zaman ne oluyor? Atlıyor mukod bloğu şeklinde ekledim:
#include #include #include // Modified program to generate prime numbers int main() { int p, i, primes[50], PrimeIndex = 2; bool IsPrime; primes[0] = 2; primes[1] = 3; for (p = 5; p <= 50; p = p+2) { IsPrime = true; for ( i = 1; IsPrime && p / primes[i] >= primes[i]; ++i) { if (p % primes[i] == 0) { IsPrime = false; } } if( IsPrime == true) { primes[PrimeIndex] = p; ++PrimeIndex; } } for ( i = 1; i < PrimeIndex; i++) { printf("%i ", primes[i]); } return 0; }
-
balbazar bunu yazdısercoo bunu yazdı
hocam for içi doğru olduğu sürece devam etmez mi dogru işte niye devam etmesin
for ( i = 1; IsPrime && p / primes[i] >= primes[i]; ++i)
hocam burada p değeri bölü primes[i] değeri , primes[i] değerinden büyük ve eşit olana kadar devam etmesi gerekmiyor mu? Yani p / primes[i] sonucu , primes[i] değerinden zaten büyük olduğu için durması gerekmiyor mu? Yani 15/3 = 5 büyük mesela 3'ten. Demek istediğim for' un devam etmesi için sonucun 3 den yani primes[i] 'den düşük olması gerekmiyor mu ?
hayır işte yanlış anlamışsın. ordaki koşul sağlanana kadar anlamına gelmiyor, o koşul sağlandığı sürece devam et demek.
edit: konulara tekrar baktıktan sonra https://www.codingame.com/ sitesine göz at burda kodda yaptıklarının etkisini anlarsın. Biraz yetkinlik kazandıktan sonra codeforces.com a bak orda A seviyesi sorulara sonrada B seviyesinde sorulara bak.
-
whopper bunu yazdıbalbazar bunu yazdısercoo bunu yazdı
hocam for içi doğru olduğu sürece devam etmez mi dogru işte niye devam etmesin
for ( i = 1; IsPrime && p / primes[i] >= primes[i]; ++i)
hocam burada p değeri bölü primes[i] değeri , primes[i] değerinden büyük ve eşit olana kadar devam etmesi gerekmiyor mu? Yani p / primes[i] sonucu , primes[i] değerinden zaten büyük olduğu için durması gerekmiyor mu? Yani 15/3 = 5 büyük mesela 3'ten. Demek istediğim for' un devam etmesi için sonucun 3 den yani primes[i] 'den düşük olması gerekmiyor mu ?
hayır işte yanlış anlamışsın. ordaki koşul sağlanana kadar anlamına gelmiyor, o koşul sağlandığı sürece devam et demek.
He tamamdır hocam. Çok yordum galiba ama sağol sonunca tak etti bu da thanks :D
Edit: Ara sıra böle zorlanıyorum ama mantığı sonunda bi şekilde anlıyorum sizin sayenizde hocam. İnat ettim öğrenicem bir şekilde C' yi tamamen :D
balbazar tarafından 24/Ara/16 16:54 tarihinde düzenlenmiştir -
whopper bunu yazdıbalbazar bunu yazdısercoo bunu yazdı
hocam for içi doğru olduğu sürece devam etmez mi dogru işte niye devam etmesin
for ( i = 1; IsPrime && p / primes[i] >= primes[i]; ++i)
hocam burada p değeri bölü primes[i] değeri , primes[i] değerinden büyük ve eşit olana kadar devam etmesi gerekmiyor mu? Yani p / primes[i] sonucu , primes[i] değerinden zaten büyük olduğu için durması gerekmiyor mu? Yani 15/3 = 5 büyük mesela 3'ten. Demek istediğim for' un devam etmesi için sonucun 3 den yani primes[i] 'den düşük olması gerekmiyor mu ?
hayır işte yanlış anlamışsın. ordaki koşul sağlanana kadar anlamına gelmiyor, o koşul sağlandığı sürece devam et demek.
edit: konulara tekrar baktıktan sonra https://www.codingame.com/ sitesine göz at burda kodda yaptıklarının etkisini anlarsın. Biraz yetkinlik kazandıktan sonra codeforces.com a bak orda A seviyesi sorulara sonrada B seviyesinde sorulara bak.
Bir tür egzersiz galiba hocam tamamdır çok sağol tekrardan
-
Bir zamanlar asal sayılarla kafayı sıyırıyodum az kalsın ama hala bir formülü olduğuna inanıyorum :)