Tugas Anda adalah menghitung akar kuadrat dari bilangan bulat positif tanpa menggunakan operator matematika untuk mengubah angka, seperti:
- Mengatur variabel (mis. SquareRoot = 5)
- Penambahan (A + B)
- Pengurangan (AB)
- Perkalian (A * B)
- Divisi (A / B)
- Akar kuadrat, kubus, keempat, dll
- Eksponen
Operator perbandingan (seperti <,>, ==, dll) tidak dianggap sebagai "operator matematika" untuk keperluan pertanyaan ini dan diizinkan selama mereka tidak mengubah nilai suatu variabel.
Satu-satunya operator yang dapat Anda gunakan adalah ++. Pengecualian berikut berlaku:
- Jika mau, Anda dapat menginisialisasi variabel dengan mengaturnya ke 0.
- Jika bahasa Anda tidak termasuk sintaks ++, Anda dapat menggunakan sintaks yang setara, seperti foo + = 1 atau foo = foo + 1
- Akar kuadrat harus dihitung setidaknya 6 digit di luar desimal (tempat seratus-ribu) dan dikeluarkan sebagai jumlah total desimal (mis. Jika saya input 2 itu bisa keluar sebagai 14142135624 atau 1414213 tergantung pada pembulatan) . Membulatkan ke atas atau ke bawah tidak penting.
Fungsi yang ditentukan pengguna tidak diizinkan. Selain itu, fungsi simulasi dengan goto juga tidak diperbolehkan.
Saya tertarik melihat apa yang diajukan semua orang! Selamat coding!
KLARIFIKASI
Jelaskan bahwa angka adalah bilangan bulat positif. Anda boleh membuat kode yang dapat melakukan nomor apa pun tetapi tidak perlu.
KLARIFIKASI # 2
Jelaskan bahwa operator perbandingan diizinkan.
KLARIFIKASI # 3
Penambahan, pengurangan, penggandaan, pembagian, dan fungsi untuk mengubah angka tidak diperbolehkan sama sekali , terlepas dari apakah mereka disimpan ke variabel atau tidak. Saya minta maaf karena ini membatalkan pasangan jawaban yang ada, tetapi saya bermaksud mendefinisikan grup operator ini dengan "ubah nomor" untuk mencegah jawaban troll (mis. Saya hanya menggunakan fungsi sqrt (), Anda hanya melarang penambahan, perkalian, pembagian, dan pengurangan). Maaf bila membingungkan.
KLARIFIKASI # 4
Jelaskan bahwa kita membutuhkan setidaknya 5 digit. 10 digit menyebabkan kode berjalan untuk waktu yang lama.
sumber
while r*r<n*10e20:r+=1
- cukup sepele. Juga, Anda dapat mempertimbangkan mengurangi output yang diperlukan menjadi 10 ^ 8 atau lebih. Pertama, karena 10 ^ 10 lebih besar dari 2 ^ 31, dan kedua, karena akan butuh beberapa saat untuk meningkatkan setinggi itu.Jawaban:
Python 66
Keluaran
sumber
int(...*1e10)
, jika tidak sangat bagus. Meskipun, mengambilabs
nilai yang kompleks kurang lebihsqrt
menyamar.*1e10
...Python, 184 karakter
Solusi Python berikut hanya menggunakan operator increment dan tidak ada operator aritmatika sama sekali. Namun, dengan presisi yang diperlukan (10 digit), dibutuhkan waktu yang sangat lama untuk dijalankan. Anda dapat mengujinya dengan presisi lebih rendah (3 digit) dengan mengurangi
1e20
menjadi1e6
.Tidak Disatukan:
sumber
Fortran 73
Mungkin butuh sedikit waktu untuk benar-benar menentukan jawaban untuk nilai-nilai tertentu, tetapi pasti akan berhasil. Sementara saya menggunakan
*
dan-
, ini tidak mengubah nilai apa pun , hanya yangs=s+1
benar - benar mengubah apa pun.sumber
*
operator, yang jelas tidak diizinkan. Atau apakah saya entah bagaimana salah memahami pembatasan yang diberikan?*
operator untuk mengubah nomor, Anda hanya tidak menyimpan hasilnya di mana pun. Jika OP hanya ingin melarang penugasan (selain daris=s+1
), lalu mengapa menyebutkan semua operator aritmatika yang tidak diizinkan?CJam, 26 byte
Cobalah online.Tempel Kode , ketik bilangan bulat yang diinginkan di Input dan klik Run . Sebelum Anda melakukannya, saya sarankan
1e10
untuk mengubahnya1e4
.The interpreter Java menangani
1e6
dengan masukan “2” dalam waktu sekitar 15 detik.1e20
akan membutuhkan sejumlah besar RAM.Contohnya
Latar Belakang
Karena kami tidak diizinkan operator matematika untuk mengubah angka, kami akan menggunakan operator setwise untuk mengubah array.
Kode dimulai dengan "mengalikan" input ("i") dengan 1e20, tetapi tanpa perkalian yang sebenarnya. Sebagai gantinya, kami mendorong sebuah array yang berisi bilangan bulat "i", sebuah array yang mengandung bilangan bulat 1e20, mengambil produk cartesian mereka dan menghitung panjangnya.
Kemudian, kami mendorong nol dan kenaikan sampai produk bilangan bulat dengan sendirinya (dihitung seperti di atas) tidak lagi lebih kecil dari
i * 1e20
. Ini menyebabkan akar kuadrat untuk dibulatkan.Bagaimana itu bekerja
sumber
Cobra - 62
Diposting sebelum edit ketiga, tidak lagi valid.
Tidak hanya pendek, tetapi harus bebas dari luapan
n < Decimal.maxValue
sumber
r/e*r/e
, yang jelas merupakan++
operator non- matematika ...Scala, 117
Tidak menyelesaikan dalam jumlah waktu yang wajar, bahkan untuk 2 sebagai input, tetapi berhasil. Anda mungkin memperhatikan bahwa saya melakukannya
_+_
, tetapi itu hanya menambah 1, dan Scala tidak memiliki++
operator. Saya dapat menyimpan dua karakter dengan mengganti Stream bagian dalam dengan List, tetapi kemudian memori akan habis. Seperti yang tertulis, saya pikir ini hanya berskala dalam waktu pemrosesan, bukan penggunaan memori.sumber
Haskell, 70 byte
f
memberikan akar kuadrat integer dengan menemukan angka terbesar yang kuadratnya kurang dari atau sama dengan input. Fungsi kuadrats i
bertambah satu untuk setiap elemen(i,i)
matriks. (Diketik di ponsel, jadi mungkin ada kesalahan ketik).sumber
PHP, 124 byte
Ini adalah algoritma yang lengkap. Itu hanya mencoba angka sampai kuadrat dari angka itu lebih besar dari angka "goal" (yang merupakan kali input 1E
number of decimals
kuadrat (10.000 untuk hasil 2 desimal). Kemudian ia mencetak angka terakhir.Jalankan seperti ini (
-d
ditambahkan hanya untuk alasan estetika):Jangan rekomendasikan untuk mencoba ini dengan lebih dari 3 desimal atau angka di atas 10.
sumber