Umut D.

Umut D.

Powered by Jekyll & Github

  • Coding-Challenges

  • Soru

    Programcıdan, girilen kredi kartı numarasının (girilenKartNumarasi) doğruluğunu Luhn Algoritmasına göre kontrol eden bir kod oluşturması isteniyor.

    Luhn Algoritması, IBM’de çalışan bilim adamı Hans Peter Luhn tarafından üretilen bu algoritma, mod 10 algoritması olarak da bilinir. Dünyadaki tüm kredi kartı numaraları bir algoritmaya göre üretilirler. IMEI Numarası, Kanada Sosyal Güvenlik Numarası gibi birçok numara da Luhn algoritmasına benzer şekilde üretilir.

    Örnek

    Girdi Çıktı
    girilenSayi: 371449635398431 Sonuç: Kart numarası doğrudur.
    girilenSayi: 123456789101112 Sonuç: Kart numarası yanlıştır.

    Çözüm - C#

    using System;
    using System.Collections.Generic;
    
    internal class Program
    {
        private static void Main()
        {
            long girilenKartNumarasi = 371449635398431;
    
            // 1. Girilen Sayının son hanesini ayrı tut
            string sonHaneOlmayanSayi = girilenKartNumarasi.ToString().Remove(girilenKartNumarasi.ToString().Length - 1);
            long duzenliSayi = long.Parse(sonHaneOlmayanSayi);
    
            // 2. Tek sırada olan değerleri al
            List<int> tekSiradakiSayilar = new List<int>();
            for (int i = 1; i < duzenliSayi.ToString().Length; i += 2)
            {
                int tekSiradakiSayi = int.Parse(duzenliSayi.ToString().Substring(i, 1)) * 2;
                tekSiradakiSayilar.Add(tekSiradakiSayi);
            }
    
            // 3. Çift sırada olan değerleri 2 ile çarp
            List<int> ciftSiradakiSayilar = new List<int>();
            for (int i = 0; i < duzenliSayi.ToString().Length; i += 2)
            {
                int ciftSiradakiSayi = int.Parse(duzenliSayi.ToString().Substring(i, 1));
                ciftSiradakiSayilar.Add(ciftSiradakiSayi);
            }
    
            // 4. Tek sıradaki sayılardan elde edilen değerleri topla
            List<int> tekSayilarinToplami = new List<int>();
            foreach (int tekSayi in tekSiradakiSayilar)
            {
                if (tekSayi < 10)
                {
                    tekSayilarinToplami.Add(tekSayi);
                }
                else
                {
                    int ilkSayi = Convert.ToInt32(tekSayi.ToString().Substring(0, 1));
                    int ikinciSayi = Convert.ToInt32(tekSayi.ToString().Substring(1));
    
                    tekSayilarinToplami.Add(ilkSayi + ikinciSayi);
                }
            }
    
            // 5. Ayrılan iki ayrı sıradaki sayıları birleştir
            List<int> tumSayilar = new List<int>();
            tumSayilar.AddRange(tekSayilarinToplami);
            tumSayilar.AddRange(ciftSiradakiSayilar);
    
            // 6. Tüm değerleri topla, sonucu 9 ile çarpıp son haneyi al
            int toplam = 0;
            foreach (int sayi in tumSayilar)
            {
                toplam += sayi;
            }
    
            int sonuc = toplam * 9;
            sonuc %= 10;
    
            // 7. Girilen sayının son hanesi ile elde edilen son kontrol sayını karşılaştır
            bool sonHaneDogruMu = girilenKartNumarasi.ToString().EndsWith(sonuc.ToString());
            if (sonHaneDogruMu)
            {
                Console.WriteLine("Kart numarası doğrudur.");
            }
            else
            {
                Console.WriteLine("Kart numarası yanlıştır.");
            }
    
            Console.Read();
        }
    }