//uygulamayı internet üzerinden çalıştırmak isterseniz: https://repl.it/@primalshade/OBEB-OKEK-C using System; using System.CodeDom; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Eventing.Reader; using System.Dynamic; using System.Linq; using System.Net.NetworkInformation; using System.Runtime.InteropServices; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; namespace Okek { public class Program { static void Main(string[] args) { Console.WriteLine("OBEB ve OKEK hesaplaması yapılacak sayı adedini giriniz."); string userInputString = Console.ReadLine(); while (int.Parse(userInputString) > 10 || int.Parse(userInputString) < 2) { Console.WriteLine("Girilen 'n' değeri 2 <= n <= 10 şartını sağlamıyor."); Console.Write("Tekrar sayı giriniz: "); userInputString = Console.ReadLine(); } int numbersCount = int.Parse(userInputString); var inputNumbers = new int[numbersCount]; for (int i = 0; i < numbersCount; i++) { Console.Write($"{i + 1}. sayıyı giriniz: "); int ithNumber = int.Parse(Console.ReadLine()); // kullanıcı 0 sayısı girerse, sayı 1 olarak alınıyor (örnek uygulamada da böyle) if (ithNumber == 0) { ithNumber = 1; } inputNumbers[i] = ithNumber; } Console.WriteLine(); //geçici //int[] inputNumbers = { 5, 10, 13 }; //int[] inputNumbers = { 255, 125}; //int numbersCount = inputNumbers.Length; int obeb = 1; int okek = 1; Console.WriteLine(); bool isDone = false;
while (!isDone)
{
Console.WriteLine();
for (int i = 0; i < numbersCount; i++)
{
Console.Write(inputNumbers[i]);
Console.Write("\t");
// son eleman mı ?
if (i == numbersCount - 1)
{
// evet.
Console.Write(" | ");
}
}
// bu döngü haddinden fazla çalışabilir
// dolayısıyla çalışması gerektiği kadar çalıştıktan sonra döngüden çıkılmalıdır
int maxNumber = inputNumbers.Max();
if (maxNumber == 1)
{
// dizideki en büyük sayı 1 ise, adam 1, 1, 1, .. şeklinde girmiş olmalı
Console.Write("1");
isDone = true;
}
for (int i = 2; i <= maxNumber; i++)
{
int counter = 0; // konsola yazılan sayı adeti
// i, asal sayı değilse uğraşmaya gerek oyk
if (IsPrime(i))
{
// i asal sayı fakat herhangi birini bölmüyorsa uğraşmaya gerek yok
if (HerhangiBiriniBolenMi(inputNumbers, i))
{
Console.Write(i);
// BAŞLANGIÇ: OBEB & OKEK HESAP
// her halükarda, her bir bölen OKEK hesabı için kullanılır
if (HepsiniBolenMi(inputNumbers, i))
{
// Yalnızca hepsini bölüyorsa OBEB hesabı için kullanılır
Console.Write("+");
obeb = obeb * i;
okek = okek * i;
}
else
{
okek = okek * i;
}
// BİTİŞ: OBEB & OKEK HESAP
for (int j = 0; j < numbersCount; j++)
{
if (inputNumbers[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.
inputNumbers[j] = inputNumbers[j] / i;
}
counter++;
}
}
}
if (counter == numbersCount)
{
// eğer bütün sayılar 1 ise işlem bitmiş demektir
// isDone true yapılmalı
isDone = inputNumbers.All(t => t == 1);
// haddinden fazla çalışabilecek döngünün sonlandırılması
break;
}
}
}
Console.WriteLine();
for (int i = 0; i < inputNumbers.Length; i++)
{
Console.Write(inputNumbers[i]);
Console.Write("\t");
}
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("OBEB " + obeb);
Console.WriteLine("OKEK " + okek);
}
public static bool HepsiniBolenMi(int[] numbers, int hepsiniBolecekSayi)
{
int toplamSayiSayisi = numbers.Length;
int bolunenSayiSayisi = 0;
foreach (var number in numbers)
{
if (number % hepsiniBolecekSayi == 0)
{
bolunenSayiSayisi = bolunenSayiSayisi + 1;
}
}
if (bolunenSayiSayisi == toplamSayiSayisi)
return true;
else
return false;
}
public static bool HerhangiBiriniBolenMi(int[] numbers, int bolecekOlanSayi)
{
foreach (var number in numbers)
{
if (number % bolecekOlanSayi == 0)
return true;
}
return false;
}
public static bool IsPrime(int number)
{
int bolenSayisi = 0;
for (int i = 2; i <= number; i++)
{
if (number % i == 0)
{
bolenSayisi += 1;
}
}
return bolenSayisi == 1;
}
}
}
Hiç yorum yok:
Yorum Gönder