Tantangan
Dengan bilangan bulat positif N
, hasilkan jumlah dari N
resiprokal pertama sebagai fraksi yang tepat, yang direpresentasikan sebagai sepasang bilangan bulat dalam urutan yang konsisten yang menunjukkan pembilang dan penyebut.
Aturan
Keluaran harus tepat.
Output harus berupa sepasang bilangan bulat dalam urutan yang konsisten yang mewakili pembilang dan penyebut.
Dilarang menggunakan tipe angka non-integer (built-in atau perpustakaan).
- Klarifikasi / pengecualian: tipe numerik non-integer baik-baik saja jika dan hanya jika semua nilai yang digunakan, dihitung, dan dikembalikan adalah bilangan bulat (yaitu bahasa Anda menggunakan bilangan rasional secara default, tetapi Anda hanya menggunakan aritmatika bilangan bulat dalam jawaban Anda)
Keluaran harus dikurangi sebanyak mungkin. (
3/2
tidak apa-apa,6/4
tidak)Celah standar dilarang.
Kiriman harus bekerja untuk input setidaknya hingga 20, atau meta ini , mana yang lebih tinggi.
Uji Kasus
1: 1/1
2: 3/2 (1/1 + 1/2)
3: 11/6 (1/1 + 1/2 + 1/3)
4: 25/12 etc.
5: 137/60
6: 49/20
20: 55835135/15519504
56: 252476961434436524654789/54749786241679275146400
226: 31741146384418617995319820836410246588253008380307063166243468230254437801429301078323028997161/5290225078451893176693594241665890914638817631063334447389979640757204083936351078274058192000
Generasi Uji-Kasus (Python 3)
import fractions
def f(x):
return sum(fractions.Fraction(1,i) for i in range(1,x+1))
Mirip dengan tantangan ini dan tantangan ini .
Numerator adalah OEIS A001008 , dan penyebutnya OEIS A002805 .
code-golf
math
rational-numbers
pizzapants184
sumber
sumber
gcd
"fungsi bawaan" jika bahasa Anda menyediakannya?gcd
dan fungsi bawaan lainnya baik-baik saja. Jenis rasional / fraksional tidak diperbolehkan.Jawaban:
Python 2 ,
8079 byteCobalah online!
Mencetak pembilang dan penyebut.
Yay! Dukungan MathJax !!!! Satu mengamati:
Kemudian, berpikir tentang rekursi, untuk positif, dalam umerator:n
N
dan tidak ada yang bisa memikirkann!
D
enominator secara rekursif juga; dengan demikianexec
.Kita harus membayar Reduksi Pecahan Fraksi dengan perhitungan GCD di
while
loop; dan kemudian kita selesai.sumber
Jelly , 10 byte
Cobalah online!
Bagaimana itu bekerja
sumber
J , 16 byte
Cobalah online!
Jalankan contoh
Bagaimana itu bekerja
J , 9 byte, menggunakan tipe pecahan
Cobalah online!
J memberikan pecahan untuk pembagian int-int jika tidak dapat dibagi.
sumber
2 x:1#.1%1+i.
dihitung sebagai jawaban yang valid, atau apakah ini merupakan penggunaan tipe rasional yang tidak valid?05AB1E , 10 byte
Cobalah online!
Menggunakan metode yang sama dengan semua entri lainnya. Output dalam bentuk
[denominator, numerator]
.sumber
Bahasa Wolfram (Mathematica) , 30 byte
Cobalah online!
14 byte jika tipe fraksional bawaan diizinkan
Cobalah online!
sumber
InputForm@HarmonicNumber
(24 byte) memberikan output dalam format yang diberikan oleh OP.JavaScript (ES6), 60 byte
Pengembalian
[numerator, denominator]
.Cobalah online!
Bagaimana?
Metode ini mirip dengan jawaban Python @ ChasBrown .
Kami pertama-tama menghitung pembilang yang tidak direduksiSebuah dan penyebut yang tidak direduksi b dengan memulai dengan a = 0 dan b = 1 dan secara rekursif melakukan:
sampain = 0 .
Kami menabung( a , b ) ke ( p , q) dan kemudian menghitung a ← gcd ( a , b ) dengan:
sampaib = 0 .
Kami akhirnya mengembalikan pembilang yang dikurangip / a dan mengurangi penyebut q/ a .
sumber
Perl 6 ,
5753 byteCobalah online!
Blok kode anonim yang mengambil integer dan mengembalikan tuple
denominator, numerator
.Jika kita diizinkan untuk menggunakan tipe fraksional, itu akan menjadi byter yang jauh lebih sederhana:
Cobalah online!
sumber
Oktaf , 29 byte
Cobalah online!
sumber
C ++ 17 (gcc) , 108 byte
Hanya gunakan bilangan bulat aritmatika:
Cobalah online!
C ++ 17 (gcc) , 108 byte
Cobalah online!
Sama seperti di bawah ini, tetapi gunakan C ++ 17's
std::gcd
.C ++ (gcc) , 109 byte
Cobalah online!
Karena C ++ tidak memiliki dukungan bigint asli, ini pasti akan meluap
n>20
.Memerlukan:
import
Pernyataan usang gcc .std::__gcd
.-O0
(Saya kira begitu) kalau tidak kompiler akan mengoptimalkan keluard/=a
.long
.Penjelasan:
a*d
ke bilangan bulat terdekat dengan melemparkana*d+.5
kelong
, dan menetapkan ken
. Sekarangn/d
adalah output.std::__gcd
.sumber
auto a=0.
bukandouble a=0
(1 Char kurang)?Pari / GP , 34 byte
Cobalah online!
17 byte jika tipe fraksional bawaan diizinkan
Cobalah online!
sumber
MATL, 13 byte
Cobalah di MATL Online
Metode yang sama seperti yang digunakan dalam jawaban Jelly @Dennis .
(Output tersirat, mencetak denominator pertama dan kemudian pembilang.)
Ketidakakuratan titik mengambang berarti ini tidak bekerja untuk n = 20, karena nilai menengah terlalu besar.Sepertinya hasil test case adalah salah ketik, ini mengembalikan jawaban yang sama dengan jawaban lain untuk n = 20.Berikut ini adalah versi pelestarian tipe integer (25 byte) yang saya coba saat itu, sebelum menemukan ini:
25 byte, masukan hingga 43
Cobalah online!
Melemparkan angka ke
uint64
sebelum mengoperasikannya, melakukan aritmatika secara eksplisit dalam satu lingkaran (tanpa menggunakanprod
atausum
). Lebih penting lagi, membagi pembilang parsial dan penyebut dengan GCD mereka setiap langkah di sepanjang jalan, pada akhir setiap iterasi. Ini meningkatkan rentang inputn
hingga 43. Sebagian kode didasarkan pada jawaban Python @Chas Brown.Metode alternatif (asli) menggunakan LCM daripada faktorial:
1615 byteCobalah di MATL Online
sumber
Excel VBA, 141 byte
Membawa input dari
[A1]
dan keluaran ke konsol.Tidak Disatukan dan Dikomentari
sumber
dc , 87 byte
Cobalah online!
Daun ini pembilang dan penyebut di atas tumpukan agar, sebagaimana diizinkan oleh ini keluaran default. Karena
dc
tidak memilikigcd
built-in, ini menggunakan algoritma Euclidean untuk menghitunggcd
.sumber
Stax , 11 byte
Jalankan dan debug itu
Penjelasan:
Kami ingin menghitung:
Kita sekarang membutuhkan penyebutb dan daftar pembilang Sebuahsaya :
Kita dapat membuatb = n ! , maka kita memiliki:
Jadi kita punya:
sumber
APL (NARS), 56 karakter, 112 byte
uji:
Dalam beberapa kata kurangi "fungsi penjumlahan pada 2 bilangan pecahan" (satu bilangan pecahan adalah daftar 2 bilangan bulat) di set:
ini di bawah ini tampaknya salah:
tetapi jika saya mengubah jenis input dari:
sumber
APL (Dyalog Unicode) ,
1512 byteCobalah online!
Fungsi Tacit, mengambil satu argumen
⍵
. Menghemat satu byte dengan menghapus⌽
jika kita diizinkan untuk mencetak penyebut terlebih dahulu.Terima kasih @dimaima selama 3 byte.
Bagaimana:
sumber