Girilen iki sayi arasindaki asal sayilar. C dili

Başlatan empax, 10 Mayıs 2011 - 12:19:42

« önceki - sonraki »

0 Üyeler ve 4 Ziyaretçi konuyu incelemekte.

empax

Merhabalar.
Girilen iki sayi arasindaki asal sayilari bulan programcik yapmaya calistim. Programda sorunlu bolgeler ve eksik olan yerler icin yardimci olmanizi rica edebilir miyim :)
Ayrica ciktida sorun var. Girilen sayilar 3 ve 9 olsun, cikti 3 5 5 7 7 7 seklinde oluyor.
Asal sayilari hesaplayan bolumde de eksik var buyuk sayilarda yanlis sonuclar veriyor.

#include <stdio.h>
#include<conio.h>
     int main()
{
     int ilk,son, bolen, kalan=0;

        printf (" iki sayi giriniz: ");
        scanf("%d %d",&ilk,&son);
         
             
             for(ilk;ilk<son;ilk++)
             
             {
                                   for (bolen = 2; bolen < ilk; bolen++)
                                   {
                                       
                                       if(ilk%bolen==0)
                                       
                                       
                                       break;
                                       printf("%d ",ilk);
                                       
                                       }     
        }
             getch();
             return 0;
}

بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

eribol

#1
Sanırım bu turbo c ile derlenmiş. Biraz değiştirdim
Alıntı Yap#include <stdio.h>
     int main()
{
     int ilk,son, bolen, i, d;

        printf (" iki sayi giriniz: ");
        scanf("%d %d",&ilk,&son);
         
             
             for(i=ilk;i<son;i++)
             
             {
                                   for (bolen = 2; bolen<i; bolen++)
                                   {
                                       
                                       if(i%bolen==0){d=0; break;}
                                       else d=1;
                                       
                                       
                                       }     if(d==1)printf("%d", i);
        }
             return 0;
}
i değişkeni deneme amaçlı kullanıldı.

Pardon büyük sayılarda sorun veriyor. 3,5,7 ile biten tüm sayıları yazdırıyor. Kafa iyi değil, olmamış hiç :D


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 10 Mayıs 2011 - 13:32:37

Şimdi oldu sanırım :)eribol@ubuntu:~$ ./a
iki sayi giriniz: 3
105
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
eribol@ubuntu:~$

empax

Cok tesekkurler @eribol. Seyenizde eksiklerimi gordum. :)
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

travego0403

Program gayet güzel çalışıyor.Şöyle bir tavsiyede bulunabilir miyim? :)

2.for döngüsünde 2'den başlayarak sayıya kadar olan tüm sayılar deneniyor. Bunun yerine 2'den başlayarak sayının yarısına kadar denemek yeterlidir diye düşünüyorum. Böylece büyük sayılarda gereksiz denemelerin önüne geçilebilir. Belki hız önemsiz ama küçük programlarda olsa böyle şeylere dikkat ederek kendimize optimum kod yazma alışkanlığı kazandırabiliriz.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

eribol

@travego0403; haklısın. Öncelikli amaç sonuçları doğru bulmak olduğu için o kısmı es geçmiştim.

travego0403

Alıntı yapılan: eribol - 10 Mayıs 2011 - 15:10:36
@travego0403; haklısın. Öncelikli amaç sonuçları doğru bulmak olduğu için o kısmı es geçmiştim.
:)
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

Jey@Nfer

#6
senin dediğin işi yapan bir programcığı bir ara anlatımlı olarak yazmıştım kısmet sanaymış :D istersen inceleyebilirsin..
aradaki kod dışı parçalar kontrol noktası gibi düşün yani oraları denetleme için koymuştum silmedim..
ayrıca biraz da fanteziye kaçıp tamamen rekürsif fonkisyonlar kullandım
işine yarayabilir..



// burada tamamen rekürsif fonksiyonlar kullanılmıştır
// J3y@NfeR\\

int sayi;
int sonuc=0;
// int a=0,b=0,c=0;   bunlar kontrol üniteleri için..

main()
{
    printf("Kaça kadar olan asal sayıları ve onların toplamını görmek istiyorsunuz?\n");
    scanf("%d",&sayi);

        if((sayi%2)==0) //burası girilen sayıyı çift ise bir azaltıp tek sayı yapar , böylece 2 kat daha az döngü oluşur
        {
        sayi=sayi-1;
        /* a=a+1;
        printf("aaaaaaaaaaaaaaaaaa%d\n\n",a); */
        }

    printf("\n");
    toplam(sayi);
    sonuc+=2;
    // printf("burdaki sayı=%d\n",sayi);
    printf("2=%d\n",sonuc);
}


int toplam(topla)
{
    if(sayi>2)
    {
        // b=b+1;

        sonuc=sonuc+asal(sayi); // sonuc işleminde asal fonksiyonundan çıkmayı başarabilmiş asal sayı toplanır..
        sayi=sayi-2; //yukardan gelen sayı zaten tek sayıdır asal sayılar da tek sayı olmak zorunda olduğu için sayı 2 azaltılır
     //printf("bbbbbbbbbbbbbbbb%d\n",b);
     //printf("bbbbbbbbbbbbsayi%d\n\n",sayi);
        toplam(sayi); // azaltılmış olan sayı asal ise toplanmak üzere rekürsif olarak toplam fonksiyonuna aktarılır...
    }

    else
    {
    /* c=c+1;
    printf("cccccccccccccccccc%d\n",c);
    printf("cccccccccccccsonuc%d\n\n",sonuc); */
    return sonuc;
    }


}


int asal(deger)
{
int kalan;

// printf("\nkontrol noktası1(deger=%d, sayi=%d)\n",deger,sayi);

    if(deger==sayi) // asal fonksiyonunun parametresi olan deger 2 eksiltilir
    {
    // printf("////deger=sayi, deger=%d , sayı=%d \n",deger,sayi);
    deger=(deger-2);
    // printf("deger=sayi, deger=%d , sayı=%d \\\\\\\n\n",deger,sayi);
    }

    if (deger>2)
    {
    kalan=sayi%deger; // yukardan gelen sayı ile deger fonksiyonunun bölümünden kalan kontrol edilir
    // printf("\nkontrol noktası2(deger=%d, sayi=%d)\n",deger,sayi);
        if(kalan==0) // kalan 0 ise asal sayı değildir
        {
         // printf("\nkontrol noktası3(deger=%d, sayi=%d)\n",deger,sayi);
        return 0;
        }

        else // kalan 0 değilse
        {
        // printf("\nkontrol noktası4(deger=%d, sayi=%d)\n",deger,sayi);
        asal(deger-2); // deger parametresi 2 azaltılıp rekürsif olarak sayı/deger işleminden kalan nedir öğrenmek üzere asal fonksiyonuna gönderilir ..
        }
    }
    else // eğer kalan asla 0 olmamışsa değer parametresi azala azala 1 olacaktır, deger 1 ise de sayı asaldır demektir...
    {
       // printf("\nkontrol noktası5(deger=%d, sayi=%d)\n",deger,sayi);
       printf("%d+",sayi);
        return sayi; // sonuc işlemine sokulmak için bir asal sayı daha :D
    }
}

Hırs , azim , tevekkül ...

www.mehmetvahit.net

mami96

Ne yalan soyleyeyim matematigimi programlama ile gelistirmeye calisiyorum. Dogru mantik kuruluysa kodlar bu olabilir mi?


#include <stdio.h>

int asaltest(const int);

int main()
{
   unsigned int a, b;
   
   printf("ilk sayiyi girin: ");
   scanf("%d", &a);
   printf("ikinci sayiyi girin: ");
   scanf("%d", &b);
   
   while(a <= b)if(asaltest(a++))printf(" %4d", a-1);
   
   return 0;
}

int asaltest(const int c)
{
   unsigned int d=2;
   
   while(d < c)if(c % d++ == 0)return false;
   
   return true;
}


empax

بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

sem

Girilen sayıların ikiden küçük olup olmadığını da bakılırsa tam olarak bütün gereksinimler sağlanmış olur sanırım =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Jey@Nfer

2'den küçük derken y
Alıntı yapılan: sem0900 - 26 Mayıs 2011 - 01:42:02
Girilen sayıların ikiden küçük olup olmadığını da bakılırsa tam olarak bütün gereksinimler sağlanmış olur sanırım =)
:D



int sayi=0;

while(sayi<2)
{
    printf("Kaça kadar olan asal sayıları ve onların toplamını görmek istiyorsunuz?\n");
    scanf("%d",&sayi);
}


bunu eklersek tamamdır o zaman:D
Hırs , azim , tevekkül ...

www.mehmetvahit.net

microanaliz

#11
#include<stdio.h>
int main()
{
int sayi1,sayi2,m,m1,m2,m3,m4,m5,m6,m7,m8,m9,n;

printf("2,3,5,7 ondan küçük asal sayılar\n");
printf("İki sayi girin aralarındaki asalları bulalım:(10 dan büyük olsun)\n");
scanf("%d%d",&sayi1,&sayi2);


for(n=sayi1;n<=sayi2;n++){
m=n%2;
m1=n%3;
m3=n%4;
m4=n%5;
m5=n%6;
m6=n%7;
m7=n%8;
m8=n%9;
if(m==0||m1==0||m2==0||m3==0||m4==0||m5==0||m6==0||m7==0||m8==0||m9==0)
printf("");
else
printf("%d\n",n);}


return 0;
}
bu kodlar işini görür C dilinde yazılmıştır.(wikide yeterince kaynak var hazırlıyoruz istersen orayada bakabilirsin)
MicroAnaliz

empax

Farkli bir cozum olmus paylasim icin tesekkurler.  :)
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

microanaliz

Basit bir çözüm herkes yapalirdi sanırım
MicroAnaliz