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
}