20 Şubat 2017 Pazartesi

Obeb Okek Hesabı - C


#define _CRT_SECURE_NO_WARNINGS #include "stdio.h" // fonksiyon tanımlamaları _Bool asal_mi(int i); _Bool herhangi_birini_bolen_sayi_mi(int sayilar[], int sayi); _Bool hepsini_bolen_sayi_mi(int sayilar[], int sayi); _Bool islem_tamamlanmis_mi(int sayilar[]); int en_buyuk_sayi(int sayilar[]); int global_hesaplanacak_sayi_sayisi = 0; int main() { printf("OBEB ve OKEK hesabı yapılacak sayı miktarını giriniz: "); scanf("%d", &global_hesaplanacak_sayi_sayisi); while (global_hesaplanacak_sayi_sayisi > 10 || global_hesaplanacak_sayi_sayisi < 2) { printf("Girilen 'n' değeri 2 <= n <= 10 şartını sağlamıyor."); printf("Tekrar sayı giriniz: "); scanf("%d", &global_hesaplanacak_sayi_sayisi); } // Kullanıcıdan sayıar alınıyor: int hesaplanacakSayilarDizisi[10]; for (size_t i = 0; i < global_hesaplanacak_sayi_sayisi; i++) { printf("%u. sayiyi giriniz: ", i+1); int hesaplanacakSayi; scanf("%d", &hesaplanacakSayi); // kullanıcının girdiği sayı 0 ise, // girilen sayı 1 olarak alınıyor if(hesaplanacakSayi == 0) { hesaplanacakSayi = 1; } hesaplanacakSayilarDizisi[i] = hesaplanacakSayi; } printf("\n"); int obeb = 1; int okek = 1; _Bool isDone = 0; printf("\n"); while (!isDone) { printf("\n"); for (int i = 0; i < global_hesaplanacak_sayi_sayisi; i++) { printf("%d", hesaplanacakSayilarDizisi[i]); printf("\t"); // son eleman mı ? if (i == global_hesaplanacak_sayi_sayisi - 1) { printf(" | "); } } // alttaki döngü haddinden fazla çalışabilir // dolayısıyla çalışması gerektiği kadar çalıştıktan sonra döngüden çıkmalıdır const int dizidekiEnBuyukSayi = en_buyuk_sayi(hesaplanacakSayilarDizisi); if(dizidekiEnBuyukSayi == 1) { // Bütün sayılar 1 olarak girilmiş isDone = 1; printf("1"); } for (int i = 2; i <= dizidekiEnBuyukSayi; i++) { int counter = 0; // i, asal sayı değilse uğraşmaya gerek yok if (asal_mi(i)) { // i asal sayı fakat herhangi birini bölm�yorsa uğraşmaya gerek yok if (herhangi_birini_bolen_sayi_mi(hesaplanacakSayilarDizisi, i)) { //printf(i); printf("%d", i); // BAŞLANGIÇ: OBEB & OKEK HESAP // her şekilde, her bir bölen OKEK hesabı için kullanılır if (hepsini_bolen_sayi_mi(hesaplanacakSayilarDizisi, i)) { // Yalnızca hepsini bölüyorsa OBEB hesabı için kullanılır printf("+"); obeb = obeb * i; okek = okek * i; } else { okek = okek * i; } // BÜTÜN: OBEB & OKEK HESAP for (int j = 0; j < global_hesaplanacak_sayi_sayisi; j++) { if (hesaplanacakSayilarDizisi[j] % i == 0) { // Dizi içindeki i ile kalansız bölünebilen sayıları i'ye bölüyoruz. // Yeni sayıyı bölünen sayı ile değiştiriyoruz. hesaplanacakSayilarDizisi[j] = hesaplanacakSayilarDizisi[j] / i; } counter++; } } } if (counter == global_hesaplanacak_sayi_sayisi) { // eğer bütün sayılar 1 ise işlem bitmiş demektir, isDone true yapılmalı isDone = islem_tamamlanmis_mi(hesaplanacakSayilarDizisi); // haddinden fazla çalışabilecek döngünün sonlandırılması: break; } } } // 1'ler g�steriliyor. printf("\n"); for (int i = 0; i < global_hesaplanacak_sayi_sayisi; i++) { printf("%d", hesaplanacakSayilarDizisi[i]); printf("\t"); } printf("\nOBEB: %d", obeb); printf("\nOKEK %d", okek); return 0; } _Bool asal_mi(int sayi) { int bolenSayisi = 0; for (int i = 2; i <= sayi; i++) { if (sayi % i == 0) { bolenSayisi += 1; } } return bolenSayisi == 1; } _Bool hepsini_bolen_sayi_mi(int sayilar[], int sayi) { int bolunenSayiSayisi = 0; for (int i = 0; i < global_hesaplanacak_sayi_sayisi; ++i) { if(sayilar[i] % sayi == 0) { bolunenSayiSayisi++; } } if (bolunenSayiSayisi == global_hesaplanacak_sayi_sayisi) return 1; else return 0; } _Bool herhangi_birini_bolen_sayi_mi(int sayilar[], int sayi) { for (int i = 0; i < global_hesaplanacak_sayi_sayisi; ++i) { if (sayilar[i] % sayi == 0) { return 1; } } return 0; } _Bool islem_tamamlanmis_mi(int sayilar[]) { for (int i = 0; i < global_hesaplanacak_sayi_sayisi; ++i) { if (sayilar[i] != 1) { return 0; } } return 1; } int en_buyuk_sayi(int sayilar[]) { int sayi = 0; for (int i = 0; i < global_hesaplanacak_sayi_sayisi; ++i) { if (sayilar[i] > sayi) sayi = sayilar[i]; } return sayi; }

Hiç yorum yok:

Yorum Gönder