DonanımHaber Mini sürüm 2 Ocak 2026 tarihi itibariyle kullanımdan kalkacaktır. Bunun yerine daha hızlı bir deneyim için DH Android veya DH iOS uygulamalarını kullanabilirsiniz.
Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
9
Cevap
432
Tıklama
0
Öne Çıkarma
Silinebilir
X
11 yıl (2373 mesaj)
Yüzbaşı
Konu Sahibi

Teşekkürler arkadaşlar soru çözüldü.

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil





< Bu mesaj bu kişi tarafından değiştirildi xDAGx -- 23 Kasım 2014; 12:46:05 >

U
11 yıl (454 mesaj)
Yüzbaşı

Biraz zorlasan elle bile çözülebilecek gibi duruyor. Bilgisayarda, en sağ basamağa koyabileceklerinle başla. Örneğin 0 dan 9 a kadar tüm rakamlar. 0 için 0 ın soluna 0 dan 9 a rakamlar gelebilir. 1 in soluna 1 den 9 a , 2 nin soluna 2 den 9 a rakamlar gelebilir. bu şekilde ekleyerek yeterli gördüğün bir basamağa kadar (9 olabilir mesela) hepsini hesaplayıp bir array e ekle. Sonra hepsinin toplamını bul, alt tarafa da en büyük sayıya kadar olan tüm sayıların toplamını yaz ( N*(N+1)/2 ) . Sonra oranı kontrol et, 0.001 den büyük gelirse basamak sayısının artması gerekir, küçük gelirse en büyük sayıdan başlayarak array den birer birer çıkartıp hesaplamayı yapabilirsin. 0.001 den küçük geldiği yerde elindeki en büyük sayıya 1er ekleyerek(N i arttırarak) paydayı arttırıp oranın 0.01 e eşitlendiği yeri bulursun. 32 bit integer toplama için yetersiz olabilir ona dikkat et.
Bu bilgisayar için ne kadar sürer emin değilim, 2-3 basamaklı sayıları yazarsan başka bir çözüm görünebilir gibi duruyor ama çıkartamadım.


Bu mesaja 1 cevap geldi.
L
11 yıl (2084 mesaj)
Yüzbaşı

19448003 Buldum. 0.01 için 302501 buluyor.


Düzenleme: Gelen uyarılar doğrultusunda, 19448001 bulunuyor artık.


C# kodu
 
static void Main(string[] args)
{
double ratio = 1;
int nonIncs = 0;
long counter = 1;
while (ratio >= 0.001)
{
if (isNonIncreasing(counter))
{
nonIncs++;
}
ratio = (double) nonIncs / counter;
counter++;
}
Console.Write("k = " + --counter);
Console.ReadKey();
}

static bool isNonIncreasing(long d)
{
long temp = d;
string digit = d.ToString();
int x = digit.Count() - 1;
if (x == 0)
return true;

for (int i = x; i > 0; i--)
{
if (digit[i] > digit[i - 1])
return false;
}
return true;
}

*********
Düzenlemeden Önce
*********

static void Main(string[] args)
{

float ratio = 1;
List<long> nonIncs = new List<long>();
long counter = 1;
while (ratio >= 0.001)
{
if (isNonIncreasing(counter))
{
nonIncs.Add(counter);
}
ratio = (float) nonIncs.Count() / counter;
counter++;
}
Console.Write("k = " + counter--);
Console.ReadKey();
}

static bool isNonIncreasing(long d)
{
string digit = d.ToString();
int x = digit.Count() - 1;
if (x == 0)
return true;

for (int i = x; i > 0; i--)
{
if (digit[i] > digit[i - 1])
return false;
}
return true;
}






< Bu mesaj bu kişi tarafından değiştirildi lne -- 23 Kasım 2014; 9:11:00 >
Bu mesaja 1 cevap geldi.
L
11 yıl (2084 mesaj)
Yüzbaşı

quote:

Orijinalden alıntı: seyfi84

nonIncs niye List? sadece bir sayaç, onu List yapmak gereksiz.
isNonIncreasing() metodunda x==0 kontrolü sadece 1-9 için lazım, sonrakiler için hep false, o da gereksiz performans kaybı. counter'ı 10'dan başlatırsın nasılsa 1-9 sayıları nonInc değil, bir comment satırında neden 10'dan başlattığını da belirtirsin, tamam.
Çıkan değerleri görebilmek için liste kullanmıştım, evet gereksiz olmuş epey.
1-9 arası sayılar nonInc oluyor soruda verilen örneğe göre, yoksa 10'dan başlarsanız 0.01 için 301601 bulunuyor.
Zaten en performanslı çözüm değil, sadece soruyu merak ettim ve fikir vermesi açısından paylaştım.





< Bu mesaj bu kişi tarafından değiştirildi lne -- 22 Kasım 2014; 18:21:54 >

L
11 yıl (388 mesaj)
Yüzbaşı

soruyu Türkçe'ye çevirebilrmisin ?? :s



< Bu ileti mini sürüm kullanılarak atıldı >

X
11 yıl (2373 mesaj)
Yüzbaşı
Konu Sahibi

uğraşıyoruz arkadaşlar yarin gece 23.59 son teşekkürler cevaplar için



< Bu ileti mobil sürüm kullanılarak atıldı >

E
11 yıl (15 mesaj)
Er

Ben de 0.01 için 302501 buldum ama 0.001 için 19448001 buldum. Muhtemelen dillerin farklı floating point implementasyonlarından kaynaklanıyordur.

def isNonIncreasing(a): 
mylist = range(len(str(a)))
for i in mylist:
mylist[i] = a % 10
a = a / 10
if (i > 0 and mylist[i] < mylist[i-1]):
return False
return True

ratio = 1
counter = 1
nonincscounter = 0

while (ratio > 0.001):
if (isNonIncreasing(counter)):
nonincscounter+=1
ratio = float(nonincscounter) / counter
counter+=1

print (counter)


Bu mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @lne
G
11 yıl (21343 mesaj)
Yarbay

java'da 19448001 buldum.

 

double ratio = 1;
int i = 9;
int nonIncreasingNumberCount = 9;

do {
i++;
String string_i = String.valueOf(i);
boolean isNonIncreasingNumber = true;
for (int j = 0; j < string_i.length() - 1; j++) {
if ( Integer.parseInt(string_i.substring(j, j + 1)) < Integer.parseInt(string_i.substring(j + 1, j + 2)) ) {
isNonIncreasingNumber = false;
break;
}
}
if (isNonIncreasingNumber) {
nonIncreasingNumberCount++;
}
ratio = (double) nonIncreasingNumberCount / (double) i;
} while ( !(ratio < 0.001) );

System.out.println(i);




L
11 yıl (2084 mesaj)
Yüzbaşı

counter değişkeni double iken 19448001 çıkıyor c#'ta da. Float kullanınca hassasiyet düşmüş. Zaten azaltma işlemini postfix yapmışım ilk kodda, etkisi olmamış. :)

Teşekkürler yorumlar için ben de hatalarımı görmüş oldum. :)





< Bu mesaj bu kişi tarafından değiştirildi lne -- 23 Kasım 2014; 9:10:54 >


Bu mesajda bahsedilenler: @ekdogan
G
11 yıl (21343 mesaj)
Yarbay

cevabi aldim, behlul kacar kafasi bu.





< Bu mesaj bu kişi tarafından değiştirildi Guest-E41040413 -- 23 Kasım 2014; 16:38:03 >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.