/////
Search

N-Parasitic Numbers Ending in N

๋‚ ์งœ
2022/02/20
์†์„ฑ
์ฝ”๋“œ์›Œ์ฆˆ

Parasitic Number(๊ธฐ์ƒ์ˆ˜)๋ž€?

๊ธฐ์ƒ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ณต์‹

Solution

parasitic ๊ฐœ๋… ์ž์ฒด๋Š” ์–ด๋ ต์ง€๋งŒ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค.
n์œผ๋กœ ๋๋‚˜๋Š” ๊ธฐ์ƒ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ณต์‹ n10nโˆ’1\dfrac{n}{10n -1} ์œผ๋กœ ์ˆœํ™˜์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.
๋‹ค๋งŒ ๋‚˜๋ˆ—์…ˆ, ๊ณฑ์…ˆ ์—ฐ์‚ฐ ์‹œ ๋„ˆ๋ฌด ๊ธธ์ด๊ฐ€ ๊ธด ์ˆ˜๋Š” ์–ธ์–ด ์ž์ฒด์—์„œ ์ž˜๋ผ๋ฒ„๋ฆฌ๋ฏ€๋กœ ๋‚˜๋ˆ—์…ˆ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์†”๋ฃจ์…˜์€ 8, 10, 16์ง„๋ฒ•์˜ ๋‚˜๋ˆ—์…ˆ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
// find parasitic number ending in n function calculateSpecial(n, base) { let curr=n, decimalStr='', dn=base*n-1,remainder; do { decimalStr += (~~(curr/dn)).toString(base) if (dn <= curr) { curr = remainder = curr%dn } curr *= base } while (remainder !== n) return decimalStr.slice(1) // excludes integer part }
JavaScript
๋ณต์‚ฌ
โ€ข
dn์€ denominator(๋ถ„๋ชจ)์˜ ์•ฝ์ž, remainder๋Š” ๋‚˜๋จธ์ง€, period๋Š” ๋ฐ˜๋ณต๋˜๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
โ€ข
dn์€ ๊ธฐ์ƒ์ˆ˜์˜ ๊ณต์‹์— ๋”ฐ๋ผ 10n -1์ด ๋œ๋‹ค. ๋‹จ ์—ฌ๊ธฐ์„œ๋Š” 8, 10, 16์ง„๋ฒ• ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ base๋ฅผ ๊ณฑํ•ด์ค€๋‹ค. base*n - 1
โ€ข
parseInt(curr/dn).toString(base) ์–ด์ œ ํ’€์—ˆ๋˜ ์ฝ”๋“œ์—์„œ 16์ง„๋ฒ• ๊ธฐ์ƒ์ˆ˜์—์„œ ๊ณ„์† ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋Š”๋ฐ ์ด๋ถ€๋ถ„ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. 16์ง„๋ฒ•์ผ ๋•Œ ๋ชซ์—์„œ 10์ด ๋„˜์–ด๊ฐ€๋Š” ๊ตฌ๊ฐ„์€ a,b,c,d,e ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค. Math.floor, parseInt, ~~ ์—ฐ์‚ฐ์ž๋กœ ๋ชซ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๋‹ˆ ~~ (tlide ์—ฐ์‚ฐ์ž)๊ฐ€ ์ œ์ผ ๋น ๋ฅด๋‹ค๊ณ  ํ•œ๋‹ค. (~~(curr/dn)).toString(base) ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”๋ณด์•˜๋‹ค.
โ€ข
do ๋ถ€๋ถ„์€ ๋‚˜๋ˆ—์…ˆ์„ ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„์ด๋‹ค. decimalStr์— ๋ชซ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์—ด๋“ค์„ ์ง‘์–ด๋„ฃ๋Š”๋‹ค. ๋‚˜๋จธ์ง€๊ฐ€ ๋‹ค์‹œ ์ฒ˜์Œ ์ˆ˜์™€ ๊ฐ™์•„์ง€๋ฉด (remainder===n) ์ด๋•Œ๋ถ€ํ„ฐ๋Š” ๊ฐ™์€ ๋ถ€๋ถ„์ด ๋ฐ˜๋ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ breakํ•˜๋ฉด ๋œ๋‹ค.
โ€ข
decimalStr.slice(1) parasitic number๋Š” 0.xxxx์™€ ๊ฐ™์€ ํ˜•ํƒœ์ด๋‹ค. ์ •์ˆ˜๋ถ€๋ฅผ ๋ฒ„๋ฆฌ๊ธฐ ์œ„ํ•ด sliceํ•œ๋‹ค.

Best Practice

const calculateSpecial = (t, i) => { let l = 0, n = t, o = t.toString(i); do { o += (n = (l = n * t + ~~(l / i)) % i).toString(i) } while (l != t); return o.slice(1) }
JavaScript
๋ณต์‚ฌ
โ€ข
i๋Š” base. n์€ ํ˜„์žฌ ์ˆ˜(๋‚˜๋ˆ—์…ˆ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ  ์žˆ๋Š” ์ˆ˜), t๋Š” ์ž…๋ ฅ๋ฐ›์€ ์ˆซ์ž, l์€ ๋‚˜๋จธ์ง€, o๋Š” ๋ชซ์— ํ•ด๋‹นํ•œ๋‹ค.
โ€ข
์Œ.. ์™œ ์ด๋ ‡๊ฒŒ ๋‚˜์˜จ๊ฑฐ์ง€? ๊ฐ„๊ฒฐํ•˜๊ธด ํ•œ๋ฐ ์™œ ์ด๋ ‡๊ฒŒ ๋œ ๊ฑด์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.