Baklava Ordusu
Decapat
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.
Sıfırlar lazım.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
Ne tür sayı gelecek bilemiyoruz. Sayıyı kullanıcı girecek.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?
Deneyin hocam. Biraz C# yazmıştım.C# kodu atsam çevirebilir misiniz hocam?
Sıfırlar lazım.
Ne tür sayı gelecek bilemiyoruz. Sayıyı kullanıcı girecek.
Deneyin hocam. Biraz C# yazmıştım.
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 sağ olun, C'ye çevirmeye çalışayı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))); 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.
Hocam sağ olun, C'ye çevirmeye çalışayım.
#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;
}
swap). Baştaki rakam sıfır değilse bile rakamı kendisiyle swaplemiş oluruz.Hocam ilk yöntemle işi çözdüm. Diğer yöntemler daha verimli olabilir onlara sonradan bakarım.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.