Bir kesiri ondalık sayıya dönüştürdüğünüzde ve bu sayıyı saklamak istediğinizde, sık sık yuvarlamanız gerekir, çünkü yalnızca belirli bir miktarda bellek kullanmak istiyorsunuz. Diyelim ki sadece 5 ondalık basamak saklayabilirsiniz, ardından 5/3 1.6667 olur. Yalnızca 2 ondalık basamak saklayabiliyorsanız, 1.7 olacaktır (şimdi her zaman 0 ile 9,99 arasında olduğu varsayılmaktadır).
Şimdi bu işlemi 1.7 ile tersine çevirmeye çalışırsanız ve kesirinizi geri almak istiyorsanız, 1.7'nin yalnızca yuvarlak bir sayı olduğunu bildiğiniz için bu zor olabilir. Tabii ki 17/10 deneyebilirsiniz, ancak 'zarif' 5/3 ile karşılaştırıldığında oldukça 'çirkin' bir kesir.
Bu nedenle amaç, a / b fraksiyonunu en az b paydaşıyla bulmaktır; bu, doğru yuvarlandığında yuvarlanmış ondalık sayı ile sonuçlanır.
ayrıntılar
Girdi, 0 (dahil) ve 10 (dahil değil) arasında '1' olan 1 - 5 basamaktan oluşan bir dize içerir. ilk haneden sonra. Diyelim ki n
rakam sayısını gösterir. Çıktı, iki tamsayıdan oluşan bir liste / dizi [numerator, denominator]
veya paytörün negatif olmadığı ve paydanın pozitif olduğu rasyonel bir veri türü (kendinizinkini oluşturabilir veya yerleşik kullanabilirsiniz) olmalıdır. Kesir payı / payda, n
basamağa doğru yuvarlandığında girişe eşit olmalıdır (bu n-1
, ondalık basamağın ardından gelen basamaklar anlamına gelir ).
Kısıtlama: sadece bir döngü ifadesine izin verilir. Bu, kodunuzun tamamında yalnızca bir tek döngü ifadesi (benzer for
veya while
veya goto
vb. Yanı sıra bir listenin / dizinin her öğesine kod uygulayan map
veya fold
uygulayan) gibi işlevsel döngüler kullanabileceğiniz anlamına gelir , ancak bu kodu 'kötüye kullanma' konusunda özgürsünüz veya özyineleme vb.
Bir fonksiyon yazmalısın. Dilinizde işlev yoksa (veya olsa bile), alternatif olarak girişin bir değişkende (veya stdin aracılığıyla giriş) saklandığını varsayabilir ve sonucu yazdırabilir veya bir dosyaya yazabilirsiniz. En düşük bayt sayısı kazanır.
yuvarlatma
Yuvarlama 'geleneksel' yuvarlama kurallarına uymalıdır, yani kesilecek olan son rakam 5 veya daha büyükse, yuvarlama yapacak ve diğer durumlar için yuvarlama yapacaksınız, örneğin:
4.5494 yuvarlanırken sonuçlanır
- 1 hane: 5
- 2 hane: 4.5
- 3 basamak: 4.55
- 4 basamak: 4.549
Örnekler
Lütfen aşağıdaki test vakalarını ve diğer 'ilginç' olayları ekleyin:
Input 1.7 Output 5/3
Input 0. Output 0/1
Input 0.001 Output 1/667
Input 3.1416 Output 355/113
for n in numbers: f(g(n))
eşdeğerdir map(f, map(g, numbers))
. İşlevsel sürüm map
iki kez kullanıyor , buna gerçekten izin verilmiyor mu?
repeat
, argümanının sonsuz bir listesini oluşturur. Döngü gibi görünüyor ama aslında O'nun zaman karmaşıklığı var (1). Ancak, her durumu ayrı ayrı sıralamak, işlevsel dillere izin vermemekten daha iyidir.