C/C++ Bir sayının haneleri ile en büyük ve en küçük sayıyı bulma

Baklava Ordusu

Decapat
Katılım
21 Haziran 2022
Mesajlar
640
Çözümler
2
Yer
Türkmenistan
Daha fazla  
Cinsiyet
Erkek
Açıklayayım. Herhangi bir sayı alalım. 3912. şimdi bu sayının haneleri ile en küçük ve en büyük sayı'yı bulmamız lazım. Burada en küçük 1239, en büyük 9321. şimdi bu dizi filtremesi ile çözülebilir. Çözdüm de. Ama mesela kullanıcı içinde sıfır hanesi bulunan sayı girerse? Bu sefer programımız en küçük sayıyı bulmakta işe yaramıyor. Bunu eskiden de çözmeye çalıştım ama pek zorlamadım.

Aklıma gelen şey, sıfırları sayıdan ayırıp filtrelemek, ardından kaç tane sıfır var ise, onları birinci hanenin sağına koymak. Peki neden?
19010 sayısını alalım. Sıfırları ayırıp filtreleme yaparsak, 119 oluyor. Ardından kalan sıfırları ilk hanenin, yani Bi'in sağına koymak. Böylece bu sayı ortaya çıkıyor:
10019. Bu da mümkün olan en küçük sayı.

Sorun ise, bunu nasıl yapacağımı bilmiyorum. Biliyor olsam bile, çok ama çok verimsiz bir uygulama olacak. Sizin önerileriniz neler?

Ha bu arada, C dilinde olursa güzel olur.
 
Son düzenleyen: Moderatör:
Açıklayayım. Herhangi bir sayı alalım. 3912. şimdi bu sayının haneleri ile en küçük ve en büyük sayı'yı bulmamız lazım. Burada en küçük 1239, en büyük 9321. şimdi bu dizi filtremesi ile çözülebilir. Çözdüm de. Ama mesela kullanıcı içinde sıfır hanesi bulunan sayı girerse? Bu sefer programımız en küçük sayıyı bulmakta işe yaramıyor. Bunu eskiden de çözmeye çalıştım ama pek zorlamadım.

Aklıma gelen şey, sıfırları sayıdan ayırıp filtrelemek, ardından kaç tane sıfır var ise, onları birinci hanenin sağına koymak. Peki neden?
19010 sayısını alalım. Sıfırları ayırıp filtreleme yaparsak, 119 oluyor. Ardından kalan sıfırları ilk hanenin, yani Bi'in sağına koymak. Böylece bu sayı ortaya çıkıyor:
10019. Bu da mümkün olan en küçük sayı.

Sorun ise, bunu nasıl yapacağımı bilmiyorum. Biliyor olsam bile, çok ama çok verimsiz bir uygulama olacak. Sizin önerileriniz neler?

Ha bu arada, C dilinde olursa güzel olur.

C# kodu atsam çevirebilir misiniz hocam?
 
Sayının rakamlarını bir array'e koyup, sonra da sıralanırsa çıkmaz mı? Sıfırları da mı istiyorsunuz?

Mesela 19010 için:
  • 1, 9, 0, 1, 0 -> 0, 0, 1, 1, 9
  • Minimum -> 119
  • Maximum -> 91100
 
Sayının 10 tabanında rakamları elimizde varsa array kullanılarak o kadar zorlanılmadan çözülür zaten büyük sayı için büyükten küçüğe sıralayıp çıkan sayıyı okuyoruz küçük için de tersi dediğiniz gibi sadece sıfırlar ile özel ilgilenilmesi gerek de sadece sayı verilip sayının 10 tabanındaki rakamlarını kendimiz çıkartmamız gerekiyorsa onun için sıfırdan başka bir fonksiyon yazacaksın falan biraz uzuyor işimiz.
Sayıyı oluşturan 10 tabanındaki rakamlar hazır mı veriliyor bizim mi çıkartmamız gerekiyor?
 
Sayının rakamlarını bir array'e koyup, sonra da sıralanırsa çıkmaz mı? Sıfırları da mı istiyorsunuz?

Mesela 19010 için:
  • 1, 9, 0, 1, 0 -> 0, 0, 1, 1, 9
  • Minimum -> 119
  • Maximum -> 91100
Sıfırlar lazım.

Sayının 10 tabanında rakamları elimizde varsa array kullanılarak o kadar zorlanılmadan çözülür zaten büyük sayı için büyükten küçüğe sıralayıp çıkan sayıyı okuyoruz küçük için de tersi dediğiniz gibi sadece sıfırlar ile özel ilgilenilmesi gerek de sadece sayı verilip sayının 10 tabanındaki rakamlarını kendimiz çıkartmamız gerekiyorsa onun için sıfırdan başka bir fonksiyon yazacaksın falan biraz uzuyor işimiz.
Sayıyı oluşturan 10 tabanındaki rakamlar hazır mı veriliyor bizim mi çıkartmamız gerekiyor?
Ne tür sayı gelecek bilemiyoruz. Sayıyı kullanıcı girecek.

C# kodu atsam çevirebilir misiniz hocam?
Deneyin hocam. Biraz C# yazmıştım.
 
Sıfırlar lazım.


Ne tür sayı gelecek bilemiyoruz. Sayıyı kullanıcı girecek.


Deneyin hocam. Biraz C# yazmıştım.
C#:
static void Main(string[] args)
{
    int stringNumber = 19010;
    List<int> sortedList = new List<int>();
    var zeroCount = 0;
    foreach (char str in stringNumber.ToString())
    {

        if (str == '0')
        {
            zeroCount++;
        }
        else
        {
            sortedList.Add(Convert.ToInt16(str.ToString()));
        }

    }
    sortedList.Sort();
    string numberString = string.Join("", sortedList);
    long numberMin = Convert.ToInt64(numberString.Insert(1, new string('0', zeroCount)));
    sortedList.Reverse();
    numberString = string.Join("", sortedList);
    long numberMax = Convert.ToInt64((numberString + new string('0', zeroCount)));
    Console.WriteLine(numberMax + "\t" + numberMin);
}

Hocam verim kısmı ne kadar verimli bilmiyorum ama iş görür :D.Max değerde hata yapmışım düzelttim. Bu arada kullanıcı kaç karakter uzunluğunda girdi ise sayıyı o kadar uzun tuttum.
 
C#:
 static void Main(string[] args)
 {
     int stringNumber = 19010;
     List<int> sortedList = new List<int>();
     var zeroCount = 0;
     foreach (char str in stringNumber.ToString())
     {

         if (str == '0')
         {
             zeroCount++;
         }
         else
         {
             sortedList.Add(Convert.ToInt16(str.ToString()));
         }

     }
     sortedList.Sort();
     string numberString = string.Join("", sortedList);
     long numberMin = Convert.ToInt64(numberString.Insert(1, new string('0', zeroCount)));
     long numberMax = Convert.ToInt64((numberString + new string('0', zeroCount)));
     Console.WriteLine(numberMax + "\t" + numberMin);
 }

Hocam verim kısmı ne kadar verimli bilmiyorum ama iş görür :D.
Hocam sağ olun, C'ye çevirmeye çalışayım.
 
Hocam sağ olun, C'ye çevirmeye çalışayım.
Kod:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

int main() {
    int stringNumber = 190510;
    std::vector<int> sortedList;
    int zeroCount = 0;

    for (char str : std::to_string(stringNumber)) {
        if (str == '0') {
            zeroCount++;
        } else {
            sortedList.push_back(str - '0');
        }
    }

    std::sort(sortedList.begin(), sortedList.end());
    std::string numberString;
    for (int num : sortedList) {
        numberString += std::to_string(num);
    }
    long long numberMin = std::stoll(numberString.insert(1, std::string(zeroCount, '0')));
    
    std::reverse(sortedList.begin(), sortedList.end());
    numberString.clear();
    for (int num : sortedList) {
        numberString += std::to_string(num);
    }
    long long numberMax = std::stoll(numberString + std::string(zeroCount, '0'));

    std::cout << numberMax << "\t" << numberMin << std::endl;

    return 0;
}
Hocam buda c++ hali.
 
Aklıma gelen yöntemlerden biri, sıfırların başa gelmesine izin verip rakamları sıralamak ve ardından sıfır olmayan ilk rakamla en baştaki rakamın yerlerini değiştirmek (swap). Baştaki rakam sıfır değilse bile rakamı kendisiyle swaplemiş oluruz.

Şöyle bir gözlem de var: Bir rakamın değeri en fazla 9 olacağı için rakamların sayıdaki adetlerini bir listede tutabilir ve 0'dan 9'a bu listeyi gezip bir şeyler yapabiliriz.

Şöyle de bir seçenek var: Sayıyı direkt string olarak okuyabiliriz. Sadece bu fikri duyun istedim, bununla ne yapacağınız size kalmış.

Çözüm kodlarını paylaşmayayım, sizin düşünmenize müsaade edeyim.
 
Aklıma gelen yöntemlerden biri, sıfırların başa gelmesine izin verip rakamları sıralamak ve ardından sıfır olmayan ilk rakamla en baştaki rakamın yerlerini değiştirmek (swap). Baştaki rakam sıfır değilse bile rakamı kendisiyle swaplemiş oluruz.

Şöyle bir gözlem de var: Bir rakamın değeri en fazla 9 olacağı için rakamların sayıdaki adetlerini bir listede tutabilir ve 0'dan 9'a bu listeyi gezip bir şeyler yapabiliriz.

Şöyle de bir seçenek var: Sayıyı direkt string olarak okuyabiliriz. Sadece bu fikri duyun istedim, bununla ne yapacağınız size kalmış.

Çözüm kodlarını paylaşmayayım, sizin düşünmenize müsaade edeyim.
Hocam ilk yöntemle işi çözdüm. Diğer yöntemler daha verimli olabilir onlara sonradan bakarım.

@brkdnmz Teşekkür ederim hocam.
 

Technopat Haberler

Geri
Yukarı