Diberikan ekspresi, tugas Anda adalah untuk mengevaluasinya. Namun, jawaban Anda tidak dapat menampilkan angka lebih dari yang diperlukan, karena ini memberi kesan memiliki pengukuran yang lebih tepat daripada kenyataan.
Jumlah angka signifikan yang dimiliki angka adalah berapa banyak digit yang dimilikinya ketika ditulis dalam notasi ilmiah, termasuk angka nol di bagian akhir jika terdapat angka desimal. Sebagai contoh, 1200
memiliki 2 angka signifikan karena 1.2*10^3
tetapi 1200.
memiliki 4 angka signifikan dan 1200.0
memiliki 5 angka signifikan.
Saat menambahkan dua angka, hasilnya harus dibulatkan ke jumlah tempat yang sama dengan angka yang digit paling signifikannya paling jauh ke kiri. Misalnya, 1200 + 3 = 1200
(dibulatkan ke ratusan tempat sejak 1200 dibulatkan ke ratusan tempat) 1200.01 + 3 = 1203
,, dan 4.59 + 2.3 = 6.9
. Perhatikan bahwa 5
dibulatkan ke atas. Aturan yang sama berlaku untuk pengurangan. 0
dibulatkan ke tempat yang. Perhatikan bahwa menambah dan mengurangi tidak tergantung pada jumlah digit signifikan. Sebagai contoh,999 + 2.00 = 1001
karena 999 dibulatkan ke tempat yang satu dan 2,00 dibulatkan ke tempat yang keseratus; yang dibulatkan ke tempat yang lebih sedikit adalah 999, jadi hasilnya, 1001,00, harus dibulatkan ke tempat yang juga. Demikian pula, 300 + 1 - 300 persis sama dengan 1, tetapi 300 dibulatkan ke ratusan tempat, sehingga hasil akhir juga harus dibulatkan ke tempat ratusan, memberikan 0, 300. + 1 - 300. akan sama dengan 1 pada sisi lain.
Saat mengalikan atau membagi dua angka, bulatkan ke angka digit signifikan dari angka dengan digit paling signifikan. Misalnya, 3.839*4=20
karena nilai pastinya 15.356
,, putaran ke 20
karena 4
hanya memiliki satu angka penting. Demikian pula, 100/4=30
karena kedua angka memiliki satu angka signifikan, tetapi 100./4.00=25.0
karena kedua angka memiliki 3 angka signifikan. 0
didefinisikan memiliki 1 angka signifikan.
Ekspresi hanya akan berisi *
, /
, +
, dan -
, (dan tanda kurung). Urutan operasi harus diikuti dan hasilnya harus dibulatkan setelah setiap operasi. Jika tanda kurung ditinggalkan dalam serangkaian penambahan atau pengurangan atau serangkaian perkalian dan pembagian, maka bulat setelah semua operasi selesai. Misalnya, 6*0.4*2 = 5
(satu angka penting), sementara 0.4*(2*6)=0.4*10=4
dan (6*0.4)*2=2*2=4
.
Input : String, dengan ekspresi yang mengandung ()*/+-
dan digit. Untuk menyederhanakan banyak hal, -
hanya akan digunakan sebagai operator pengurangan, bukan untuk menandakan angka negatif; jawaban, bagaimanapun, masih bisa negatif dan akan membutuhkan -
awalan.
Output : Hasil dari ekspresi, dievaluasi dan dibulatkan ke jumlah digit yang benar. Catatan yang 25
salah untuk 25.0
.
Kasus uji :
3 + 0.5 --> 4
25.01 - 0.01 --> 25.00
4*7*3 --> 80
(4*7)*3 --> 90
(8.0 + 0.5)/(2.36 - 0.8 - 0.02) --> 5.7
6.0 + 4.0 --> 10.0
5.0 * 2.0 --> 10.0
1/(2.0 * (3.0 + 5.0)) --> 0.06
0.0020 * 129 --> 0.26
300 + 1 - 300 --> 0
0 - 8.8 --> -9
3*5/2*2 --> 20
Kasus tepi: Pertimbangkan masalah 501*2.0
. Nilai pastinya adalah 1002
. Mencetak 1002
memberi terlalu banyak angka penting (4, ketika kita membutuhkan 2) tetapi 1000
memberi terlalu sedikit (1, ketika kita membutuhkan 2). Dalam hal ini, program Anda harus 1000
tetap mencetak .
Sumber ini menjelaskan angka-angka penting juga: http://www.purplemath.com/modules/rounding2.htm
999 + 2.00
,.300 + 1 - 300
adalah serangkaian penambahan dan pengurangan, jadi tidak perlu dibulatkan hingga akhir.(300 + 1) - 300
akan menjadi nol.Jawaban:
Java 11,
13251379135613361290 byte+54 byte untuk memperbaiki kasus tepi
501*2.0
(memberi hasil1002
sebelumnya, tetapi sekarang benar1000
).Saya sekarang mengerti mengapa tantangan ini tidak dijawab selama hampir dua tahun ..>.> Tantangan ini memiliki kasus yang lebih khusus daripada bahasa Belanda, yang mengatakan sesuatu ..
Jawa tentu bukan bahasa yang tepat untuk tantangan semacam ini (atau codegolf apa pun) tantangan dalam hal ini;
Masukkan format
String
tanpa spasi (jika tidak diizinkan, Anda dapat menambahkans=s.replace(" ","")
(+19 byte) di bagian atas metode ini).Cobalah online.
Penjelasan:
Maaf untuk posting lama.
Bagian ini digunakan untuk input yang mengandung tanda kurung. Ini akan mendapatkan bagian-bagian yang terpisah dan menggunakan panggilan rekursif.
0.4*(2*6)
menjadi0.4*A
, di manaA
panggilan rekursif untukc(2*6)
(8.3*0.02)+(1.*(9*4)+2.2)
menjadiA+B
, di manaA
adalah panggilan rekursif kec(8.3*0.02)
danB
panggilan rekursif kec(1.*(9*4)+2.2)
→ yang pada gilirannya menjadi1.*C+2.2
, di manaC
adalah panggilan rekursif untukc(9*4)
Loop pertama ini digunakan untuk mengisi nilai-nilai
M
dank
, di manaM
adalah bilangan bulat-panjang terbesar mengenai angka-angka penting dank
panjang desimal terbesar.1200+3.0
menjadiM=2, k=1
(12, .0
)999+2.00
menjadiM=3, k=2
(999, .00
)300.+1-300.
menjadiM=3, k=0
(300, .
)Loop kedua ini digunakan untuk mengisi array
A
danb
juga nilaiq
, di manaA
jumlah angka signifikan,b
pegang bilangan bulat dengan nol terkemuka untuk mencocokkanM
, danq
merupakan titik-titik pengabaian dengan panjang terendah.1200+3.0
menjadiA=[2, 5] (12, 00030)
,,b=[1200, 0003.0]
danq=2
(30
)999+2.00
menjadiA=[3, 5] (999, 00200)
,,b=[999, 002.00]
danq=3
(keduanya999
dan200
)300.+1-300.
menjadiA=[3, 3, 3] (300, 001, 300)
,,b=[300., 001, 300.]
danq=1
(1
)501*2.0
menjadiA=[3, 4] (501, 0020)
,,b=[501, 002.0]
danq=2
(20
)Menggunakan mesin JavaScript untuk mengevaluasi input, yang akan disimpan dalam
R
dua kali lipat.1200+3.0
menjadiR=1203.0
999+2.00
menjadiR=1001.0
300.+1-300.
menjadiR=1.0
Ini menetapkan
m
nilai terkecil dalam arrayA
.A=[2, 5]
menjadim=2
A=[3, 5]
menjadim=3
A=[3, 3, 3]
menjadim=3
Ini memodifikasi
m
berdasarkan beberapa faktor.999+2.00 = 1001.0
&m=3,q=3
menjadim=4
(karenam==M
(keduanya3
) →R%1==0
(1001.0
tidak memiliki nilai desimal) →(int)R/10%10<1
((int)1001.0/10
menjadi100
→100%10<1
) →"1001".length()>m
(4>3
) →"1001".length()-q<=1
(4-3<=1
) → jadim
menjadi panjang bagian integer"1001"
(4
))3.839*4 = 15.356
&m=1,q=1
tetapm=1
(karenam==M
(keduanya1
) →R%1!=0
(15.356
memiliki nilai desimal) →R<=99
→R%10!=0
(15.356%10==5.356
) →m!=0
→ jadim
tetap sama (1
))4*7*3 = 84.0
&m=1,q=1
tetapm=1
(karenam==M
(keduanya1
) →R%1==0
(84.0
tidak memiliki nilai desimal) →(int)R/10%10>=1
((int)84/10
menjadi8
→8%10>=1
) →R<=99
→R%10!=0
(84%10==4
) →m!=0
→ jadim
tetap sama (1
))6.0+4.0 = 10.0
&m=2,q=2
menjadim=3
(karenam!=M
(m=2, M=1
) →R<=99
→R%10==0
(10%10==0
) → jadim
menjadi panjang totalR
(minus titik)"10.0".length()-1
(3
))0-8.8 = -8.8
&m=0,q=1
Menjadim=1
(karenam!=M
(m=0, M=1
) →R<=99
→R%10!=0
(-8.8%10==-8.8
) →m<1
→ sehinggam
menjadi1
)501*2.0 = 1001.0
&m=3,q=2
menjadim=2
(karenam==M
(keduanya3
) →R%1==0
(1001.0
tidak memiliki nilai desimal) →(int)R/10%10<1
((int)1001.0/10
menjadi100
→100%10<1
) →"1001".length()>m
(4>3
) →"1001".length()-q>1
(4-2>1
) → jadim
menjadiq
(2
))Sekarang
R
dibulatkan berdasarkanm
.1001.0
&m=4
menjadi1001.0
0.258
&m=3
menjadi0.26
(karenaabs(R)<1
,m-1
(2
) alih-alihm=3
digunakan di dalamMathContext
)-8.8
&m=1
menjadi-9.0
1002.0
&m=2
menjadi1000.0
Ini memodifikasi bagian integer
R
jika perlu.300.+1-300. = 1.0
&m=3,M=3
tetap1.0
(karenam>=M
→ jadiR
tetap sama (1.0
))0.4*10 = 4.0
&m=1,M=2
tetap4.0
(karenam<M
→(10^(M-m))/10<=R
((10^1)/10<=4.0
→10/10<=4.0
→1<=4.0
) → jadiR
tetap sama (4.0
))300+1-300 = 1.0
&m=1,M=3
menjadi0.0
(karenam<M
→(10^(M-m))/10>R
((10^2)/10>1.0
→100/10>1.0
→10>1.0
) → jadiR
menjadi0.0
karenaint(R/(10^(M-m)))*(10^(M-m))
(int(1.0/(10^2))*(10^2)
→int(1.0/100)*100
→0*100
→0
)Ini set
R
untukr
sebagai String, dan memodifikasi itu didasarkan pada beberapa faktor.1203.0
&m=4,k=2
menjadi1203.
(karenak>=1
→ begitur
menjadi1001.000
;r.length()>=m
(8>=4
) →r.contains(".")
→r.length()>=m
(8>=4
) → substring dari indeks0
kem+1
(5
))6.9
&m=2,k=2
tetap6.9
(karenak>=1
→ jadir
menjadi6.900
;r.length()>=m
(5>=2
) →r.contains(".")
→r.length()>=m
(5>=2
) → substring dari indeks0
kem+1
(3
))1.0
&m=3,k=0
menjadi1
(karenak<1
→ begitur
menjadi1
;r.length()<m
(1<3
) → substring dari indeks0
ker.length()
(1
))25.0
&m=4,k=4
menjadi25.00
(karenak>=1
→ begitur
menjadi25.00000
;r.length()>=m
(8>=4
) →r.contains(".")
→r.length()>+m
(8>=4
) → substring dari indeks0
kem+1
(5
))0
&m=1,k=0
tetap0
(karenak<1
→ begitur
tetap0
;r.length()>=m
(1>=1
) →!r.contains(".")
→ substring dari indeks0
kem
(1
))Ini menempatkan nol trailing kembali ke bagian integer jika perlu.
r="12"
&R=1200.0
menjadir="1200"
r="1"
&R=10.0
menjadir="10"
r="8"
&R=80.0
menjadir="80"
Dan akhirnya kami mengembalikan hasilnya, setelah kami menghapus titik-titik jejak.
1203.
menjadi1203
5.
menjadi5
Pasti bisa bermain golf dengan beberapa ratus byte, tapi saya senang ini berfungsi sekarang. Sudah butuh beberapa saat untuk memahami masing-masing kasus dan apa yang ditanyakan dalam tantangan. Dan kemudian butuh banyak trial-and-error, pengujian dan pengujian ulang untuk mendapatkan hasil di atas. Dan ketika menulis penjelasan ini di atas saya bisa menghapus ± 50 byte kode yang tidak terpakai lagi ..
sumber
501*2.0
untuk keluaran1000
(Anda harus keluaran1000
tetap , yang saya tafsirkan sebagai "masih", bukan cara baik ). Pekerjaan yang luar biasa.