Suatu hari guru kimia saya menjelaskan kepada kami tentang notasi ilmiah (menggunakan sejumlah kecil dan mengalikannya dengan kekuatan sepuluh untuk mengekspresikan jumlah besar lebih mudah), yang membawa saya kembali beberapa tahun ketika saya pertama kali mempelajarinya. Setelah mempelajari dasar-dasarnya, kami telah melakukan banyak pertanyaan matematika yang khas, beberapa di antaranya seperti berikut:
Mewakili yang berikut dalam notasi ilmiah:
a) 50000000
b) 120000000000000
c) 9000000000000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vektor
...
z) 200
...
Dan saya berpikir, "Apa? Kami diberi tahu bahwa notasi ilmiah digunakan untuk membuat penulisan angka besar lebih efisien, tetapi beberapa kasus sama sekali tidak lebih efisien!"
Pertimbangkan angkanya
300
dan perwakilannya dalam notasi ilmiah:
3x10^2
Apa, versi yang dicatat secara ilmiah ini sebenarnya menghabiskan lebih banyak ruang? Kita tidak bisa memilikinya sekarang, kan? (Ruang layar sangat berharga.)
Kita dapat menentukan sendiri apakah lebih efisien ruang untuk menulis nomor dalam notasi ilmiah atau tidak, atau ...
Tugas
Program atau fungsi Anda harus menggunakan satu nomor positif n
ukuran arbitrer (hingga apa yang didukung bahasa Anda) sebagai input dan menampilkan versi nomor yang dicatat secara ilmiah.
Namun, jika nomor asli n
, setelah menghilangkan nol jejak dan tempat desimal, membutuhkan lebih sedikit atau jumlah karakter yang sama untuk ditampilkan daripada versi yang dicatat secara ilmiah, Anda harus menampilkan nomor asli itu n
sebagai gantinya.
Kode Anda harus sesingkat mungkin karena outputnya juga harus sesingkat mungkin.
Spesifikasi
Notasi Ilmiah yang Efisien didefinisikan sebagai berikut:
bx10^e
b
adalah nomor input dibagi dengan tepat oleh kekuatan 10 sedemikian rupa sehingga 1 <= b < 10
. Angka ini harus menghapus semua nol trailing (dan titik desimal jika diperlukan), tetapi harus memiliki ketepatan angka aslinya (tentu saja, hingga batas titik desimal dalam bahasa Anda). Yaitu 90000
menjadi 9
, 13.500
menjadi 1.35
, 0.000675
menjadi 6.75
dll. Jika angka ini akhirnya mengandung lebih banyak tempat desimal daripada bahasa Anda dapat menangani, itu harus dibulatkan ke jumlah tempat desimal maksimum itu.
e
adalah eksponen di mana sepuluh dinaikkan sedemikian rupa n = b x 10^e
(ingat bahwa angka ini harus negatif jika n
lebih kecil dari 1). Angka ini seharusnya tidak memiliki angka nol atau tempat desimal (terutama karena jika bukan bilangan bulat, ada sesuatu yang salah ...).
Karakter x10^
harus tetap seperti dalam string antara b
dan e
.
Uji kasus
Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Aturan dan klarifikasi lainnya
- Nol trailing (dan / atau trailing tempat desimal) tidak dihitung terhadap jumlah karakter dari nomor input asli
n
. Ingatlah itu untuk kasus-kasus seperti test case 6 - Anda dapat mengasumsikan bahwa jika nomor input kurang dari 1, itu akan selalu mulai dengan 0 di tempat untuk digit tersebut (seperti dalam kasus uji 5-8).
- Nomor input tidak akan pernah negatif
- Built-in yang membuat tantangan ini sepele dan celah standar tidak diijinkan
- Baris baru yang tertinggal di output OK
EDIT
Terima kasih kepada pengguna81655 untuk menunjukkan kasus uji 7 dan 8 memiliki kekuatan sepuluh yang salah. Saya sekarang telah memperbaikinya jadi pastikan kode Anda mengevaluasi mereka dengan benar.
e
: 9000 -> 9e3
(hampir lebih dari 9.000 !)
x10^
. Dan itu akan menjadi sedikit adil pada pertanyaan, yang saya pikir tidak sepantasnya sekarang diposting
pi^e^i^j^k^std::vector
?