E D R , A S I H C RSS

How Many Zeros And Digits

AboutHowManyZerosAndDigits

이 문제는 주어진 수 체계의 팩토리얼 수의 0의 개수와 숫자의 개수를 찾는 것이다. b진수 체계는 0 ~ b-1 범위의 숫자를 갖게 된다.

10진수 N과 10진수 B가 한 줄씩 입력된다. 이 때 N은 20비트의 부호 없는 숫자이며, 진수 체계인 B의 범위는 1 < B <= 800 이다. 10진수에서 5! = 120 일때, 16진수 체계에서는 78이 된다. 그래서 16진수 5!은 0이 없다.

입력에 대해서 주어진 진수 체계에서 팩토리얼 수의 0의 개수와 숫자의 개수를 한 줄씩 출력한다. 두 숫자 사이에는 공백으로 구분한다. 0의 개수와 숫자의 개수가 2^31-1보다 크지는 못할 것이다.

Input

~cpp 
2 10
5 16
5 10

Output

~cpp 
0 1
0 2
1 3

풀이

작성자 사용언어 개발시간 코드
문보창 C++ ? HowManyZerosAndDigits/문보창
임인택 Java ? HowManyZerosAndDigits/임인택
주의 : 일단 10진법 이상의 진법도 10진수로 표현한다고 가정하고 문제를 풀었음
(예를 들어 A0 대신 10 0 이라고 표현한다고 가정)
회영 C++ ? HowManyZerosAndDigits/김회영
허아영 C++ 1시간 30분 HowManyZerosAndDigits/허아영

쓰레드

만약 800진법일 경우 0~9 까지의 숫자는 표현할수 있겠지만 그 이후의 숫자는 어떻게 표현하나요? 16진법으로 나타낼때 0에서 F 로 표현하는 것처럼, 800진법에서 10이상의 수를 표현해야 할 방법이 있어야 할 것 같은데요. 알파벳을 이용한다고 해도 Z(35)이후의 수는 표현할 방법이 없는데요. 이에 대한 정의가 없다면 정확한 답을 구할 수 없을 것 같습니다(문제에서 말한 0의 개수말이죠). 간단한 예를 들어 설명하자면,
{{|
16진수 0xA0 에서 두번째 자리의 A를 그냥 A로 받아들이면 0의 개수는 1개이겠지만, A라는 표기 대신에 10이라고 표기했으면 0의 개수는 2이지요. 게다가 이때에는 전체 숫자의 개수를 2라고 해야 하는지 3이라고 해야 하는지도 명확하지 않습니다. 만약 문제에서 숫자의 개수라는 표현 대신에 자리수라고 표현했으면 2이겠지만 문제에서 숫자의 개수라고 했으니 문제를 이해하는데 어려움이 많습니다. 또 10진수 680000 을 800진수로 변환할때 이를 어떻게 표기해야 할지도 명확하지가 않습니다.
|}}
그리고 문제를 설명하는 문장의 내용이 한번에 와 닿지가 않네요. 문장을 조금 다듬어 주시면 감사하겠습니다. ^^ - 임인택

책에 있는 올림피아드 문제 원문 그대로를 실었습니다. 문제가 명확하지 않다는 점을 부정할 순 없지만, 문제에 손을 댈 경우 제 주관적인 생각이 문제의 틀을 바꿔버릴 수 있기때문에 어쩔수 없습니다. 개인적 소견으로는 N!을 B진법으로 변환하는 것이므로, 입력을 받는 N이 조금만 커져도 N!이 굉장히 커지기 때문에 N은 B보다 작은 범위, 즉 B진수 체계에서 한자리를 입력받는 문제가 아닐까 합니다. 또한, 문제의 마지막 조건인 2^31-1 같이 int형의 오버플로우방지를 해 놓은 것에서 보듯 범위를 어느정도 제한해 놓았다고 보여집니다. 정확한 답변을 드리지 못해 죄송합니다. - 문보창
----
문제분류
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.2094 sec