분수를 10 진수로 변환하고 해당 숫자를 저장하려면 특정 양의 메모리 만 사용하기 때문에 반올림해야하는 경우가 있습니다. 소수점 5 자리 만 저장할 수 있고 5/3는 1.6667이된다고 가정합니다. 소수점 이하 두 자리 만 저장할 수 있으면 1.7이됩니다 (현재는 항상 0과 9.99 사이에 있다고 가정).
1.7로 반올림을 시도하고 분수를 되 찾으려면 1.7이 반올림 된 숫자라는 것을 알기 때문에 어려울 수 있습니다. 물론 당신은 17/10을 시도 할 수 있지만 그것은 '우아한'5/3에 비해 '추악한'분수입니다.
따라서 목표는 이제 가장 작은 분모가 b 인 분수 a / b를 찾는 것입니다. 이로 인해 올바로 반올림되면 소수점이 반올림됩니다.
세부
입력에 0과 1 사이의 숫자 ( '포함')와 10 (제외) 사이의 숫자가 포함 된 문자열이 포함됩니다. 첫 번째 숫자 다음에. 하자 말은 n
숫자의 수를 나타낸다. [numerator, denominator]
분자는 음수가 아니고 분모가 양수인 경우 두 개의 정수의 목록 / 배열 또는 합리적인 데이터 유형 (자체를 만들거나 내장을 사용할 수 있음)이어야합니다 . 분수 분자 / 분모는 n
숫자 ( n-1
소수점 뒤의 숫자)로 올바르게 반올림 될 때 입력과 같아야합니다 .
제한 사항 : 하나의 루프 문 만 허용됩니다. 즉 , 전체 코드에서 하나의 단일 반복문 (예 for
: while
또는 goto
등)뿐만 아니라 목록 / 배열의 모든 요소에 코드를 적용 map
하거나 fold
적용하는 기능적 루프 만 사용할 수 있지만 자유롭게 '남용'할 수 있습니다 또는 재귀 등을 사용하십시오.
함수를 작성해야합니다. 언어에 함수가 없거나 (있는 경우에도) 입력이 변수 (또는 stdin을 통해 입력)에 저장되어 있다고 가정하고 결과를 인쇄하거나 파일에 쓸 수 있습니다. 가장 적은 바이트 수가 이깁니다.
반올림
반올림은 '기존의'반올림 규칙을 따라야합니다. 즉, 마지막으로 잘릴 숫자가 5 이상이면 반올림하고 다른 경우에는 반올림합니다. 예를 들면 다음과 같습니다.
반올림하면 4.5494가 발생합니다.
- 1 자리 : 5
- 2 자리 : 4.5
- 3 자리 : 4.55
- 4 자리 : 4.549
예
다음 테스트 사례 및 기타 '관심있는'사례를 포함하십시오.
Input 1.7 Output 5/3
Input 0. Output 0/1
Input 0.001 Output 1/667
Input 3.1416 Output 355/113
for n in numbers: f(g(n))
과 같습니다 map(f, map(g, numbers))
. 기능 버전은 map
두 번 사용하는데 실제로 허용되지 않아야합니까?
repeat
는 그 인수의 무한 목록을 만듭니다. 나는 루프하는 것처럼 보이지만 실제로는 O (1)의 시간 복잡성이 있습니다. 그러나 각 경우를 개별적으로 정렬하는 것이 기능적 언어를 허용하지 않는 것보다 낫습니다.