C n tane sayının obeb ve okek değerini bulan program (listelemeli)



Program n tane sayının obeb ve okek değerini yapılan işlemleri adım adım göstererek bulur.

Program Çıktısı
C n tane sayının obeb ve okek değerini bulan program

#include stdio.h
#include conio.h 
#include locale.h

/// FONKSİYON prototipleri
int asalMi(int sayi);
int kontrolEt(int *sayiListe, int uzunluk);
void obebokekHesapla(int *sayiListe,int n);

int main()
{
    setlocale(LC_ALL, "Turkish"); /// türkçe dil
    int n = 0;
    printf("Kaç tane sayının OBEB ve OKEK değeri hesaplanacak:");
    scanf("%d", &n); /// n değerini kullanıcıdan iste
    int sayiListe[n]; /// sayi dizisini n uzunluğunda oluştur
    memset(sayiListe, 0, sizeof sayiListe); /// diziyi 0 la doldur
 
    for (int i = 0; i < n; i++) /// n tane sayıyı diziye al
    {
        printf("%d.Sayıyı giriniz:", i + 1);
        scanf("%d", &sayiListe[i]);
    }
    printf("\n=|= Obeb ve Okek Hesaplama Sonuçları =|=\n\n");
    obebokekHesapla(sayiListe,n); /// obeb okek hesaplama algosuna dizi ve n uzunluğunu ver
    getch(); /// programın kapanması için bir tuşa basılmasını bekle!
}

int kontrolEt(int *sayiListe, int uzunluk)
{
    for (int i = 0; i < uzunluk; i++) // liste uzunluğunca dön
    {
        if (sayiListe[i] != 1) // 1 den farklı elamana sahipse henüz olmamış
                return 0;
    }
    return 1; //bütün elamanları 1 se doğru dön
}

void obebokekHesapla(int *sayiListe,int n)
{
    int sayiListeTemp[n]; // 1. sayı dışında tam bölünmeyenleri sonra yazdırmak için temp dizisi tanımlıyoruz (sayı dizimiz uzunluğunda)
    memset(sayiListeTemp, 0, sizeof sayiListeTemp); /// diziyi 0 la doldur
    int okek = 1, obeb = 1;
    int asalSayi = 2, sira = 0, eslesmeSay = 0, tempSay = 0;

    /// Obeb ve Okek listelemeli hesaplama algoritması

    while (!(sira == n && kontrolEt(sayiListe, n))) /// döngüden çıkış şartı
    {
        sira = sira == n ? 0 : sira; /// sira n sayısına ulaşınca sıfırla
        eslesmeSay = sira == 0 ? 0 : eslesmeSay; /// sira sıfırsa eslesmeyide sıfırla

        if (sayiListe[sira] % asalSayi == 0) /// kalansız mı diye bak
        {
            eslesmeSay++;

            if (sira == 0) /// liste başındaki sayı ise direk yaz
            {
                printf("%d\t", sayiListe[sira]);
                sayiListe[sira] /= asalSayi; /// işlemi yap orjinal sayıyla değiştir.
            }
            else
            {
                sayiListeTemp[tempSay] = sayiListe[sira]; // yedekle sonra yazmak için
                sayiListe[sira] /= asalSayi; /// işlemi yap orjinal sayıyla değiştir.
                tempSay++; /// temp indexini artır
            }
            sira++; /// bir sonraki sayıya geç
        }
        else /// kalanlıysa
        {
            sayiListeTemp[tempSay] = sayiListe[sira]; /// yedekle sonra yazmak için
            tempSay++;
            sira++; /// bir sonraki sayıya geç
        }
        if (sira == n) /// liste sonundaysak
        {
            if (eslesmeSay > 0) /// eşleşme olmuşsa
            {
                for (int i = 0; i < tempSay; i++) /// temp sayacı kadar dön
                {
                    printf("%d\t", sayiListeTemp[i]); /// tempdeki kalansız bölünmeyen sayıları yaz
                }
                printf("| %d\n", asalSayi); /// kullanılan asal sayıyı yaz
                okek *= asalSayi; /// okek hesapla
            }
            else if (eslesmeSay != n) ///bütün sayılarda kalansız bölünmediyse bir sonraki asalı ara
            {
                do
                {
                    asalSayi++;
                } while (!asalMi(asalSayi)); /// bir sonraki asal sayıya geç
            }

            tempSay = 0; // temp sayacı sıfırla
        }
        obeb = eslesmeSay == n ? obeb * asalSayi : obeb; /// tam eşleşmede obeb hesapla
    }
    printf("\n");
    printf("Girilen Sayıların OBEB değeri = %d\n", obeb); /// hesaplanan obeb sonucunu yaz
    printf("Girilen Sayıların OKEK değeri = %d\n", okek); /// hesaplanan okek sonucunu yaz
}

int asalMi(int sayi)
{
    /// asal sayı sadece kendisine ve 1 sayısına bölünebilen sayılara denir..
    for(int i = 2; i < sayi; i++) /// 2 den başla sayının kendisine kadar dön
    {
        if(sayi % i == 0) /// kalansız bölünüyorsa
            if(sayi != i) /// bölündüğü sayı kendisi değilse
            return 0; /// yanlış
    }
    return 1; /// döngüden çıkabilirse doğru
} 

Download linklerimizde link kısaltma reklamı vardır, Linke tıkladıktan sonra 5 saniye bekleyip "Reklamı Geç" butonuna basarak ilgili dosyaya ulaşabilirsiniz.

Yorum Gönder

Yorum Kuralları
1) Küfürlü, siyasi ya da huzur bozucu yorumlar yapmayınız.
2) Konu ile alakalı yorumlar yapınız.
3) Reklam linkleri ve spam mesajlar atmayınız.

* Attığınız yorumlar moderatör kontrolünden sonra yayınlanacaktır.
* Yukarıdaki kurallara uymazsanız sitemizden engellenebilirsiniz.