folder Tahribat.com Forumları
linefolder C - C++
linefolder C Öğrenirken Yine Bir Yerde Takıldım (Arrays Ve Asal Sayılar )



C Öğrenirken Yine Bir Yerde Takıldım (Arrays Ve Asal Sayılar )

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    balbazar
    balbazar's avatar
    Kayıt Tarihi: 12/Mart/2010
    Erkek

    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 

     

    balbazar tarafından 24/Ara/16 16:51 tarihinde düzenlenmiştir
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    pineapplemen.
    sercoo
    sercoo's avatar
    Kayıt Tarihi: 06/Eylül/2015
    Erkek

    hocam for içi doğru olduğu sürece devam etmez mi dogru işte niye devam etmesin


    i might be a pineapple but you're a fineapple baby
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    whopper
    whopper's avatar
    Kayıt Tarihi: 26/Haziran/2008
    Erkek

    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
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    balbazar
    balbazar's avatar
    Kayıt Tarihi: 12/Mart/2010
    Erkek
    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 ?

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    balbazar
    balbazar's avatar
    Kayıt Tarihi: 12/Mart/2010
    Erkek
    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 mu

    kod 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 tarafından 24/Ara/16 16:51 tarihinde düzenlenmiştir
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    whopper
    whopper's avatar
    Kayıt Tarihi: 26/Haziran/2008
    Erkek
    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 tarafından 24/Ara/16 16:53 tarihinde düzenlenmiştir
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    balbazar
    balbazar's avatar
    Kayıt Tarihi: 12/Mart/2010
    Erkek
    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
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    balbazar
    balbazar's avatar
    Kayıt Tarihi: 12/Mart/2010
    Erkek
    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

  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    sixth
    sixth's avatar
    Kayıt Tarihi: 12/Mayıs/2012
    Erkek

    Bir zamanlar asal sayılarla kafayı sıyırıyodum az kalsın ama hala bir formülü olduğuna inanıyorum :)

Toplam Hit: 2270 Toplam Mesaj: 9
c