프로 그래 밍 의 아름다움 2.2 계단 에 놀 라 쓰 러 지지 마 세 요.

이 문 제 를 보기 시 작 했 을 때 나 는 문자열 을 이용 하여 정형 수 를 나타 내 는 사상 인 줄 알 았 다. 나중에 보 니 하나의 수의 곱셈 이기 때문에 이 숫자 자체 가 크다 면 문자열 을 이용 하여 표시 하 는 것 도 불합리 하 다. 그래서 다음 문제 의 해석 을 보고 책 에서 공식 을 제시 한 후에 문제 의 뜻 을 알 게 되 었 다.
      우선, 나 는 먼저 함수 성명 과 제목 요 구 를 붙 였 다.
/*2.2        */
/*2.2.1 N!       0*/
int DutCountOf0InFactorialN(int);
/*2.2.2 N!          1   */
int DutPositionOf1InFactorialN(int);
      
      우 리 는 이러한 문 제 를 생각 합 니 다. 하나의 숫자 N 이 있 습 니 다. 그러면 1 - N 에는 몇 개의 c (c > = 1 & c < = 9) 가 존재 합 니까?우 리 는 이 공식 을 이용 하여 계산 할 수 있다.
1 - N 에 x 가 존재 하 는 개수 의 계산 공식 은 N / x + N / x2 + N / x3 + 이다. 그리고 이 공식 은 마지막 에 반드시 수렴 된다.
      따라서 다음 과 같은 코드 를 쓸 수 있 습 니 다.
/*2.2.1 N!       0*/
/*          :2 * 5 = 10,  ,      1—N     5    (  2   )*/
int DutCountOf0InFactorialN(int n)
{
	if (n <= 0)
		return 0;

	int count = 0;

	/*1-N   x         :N/x + N/x2 + N/x3 +...,             */
	while (n)
	{
		n += n / 5;
		n /= 5;
	}
	/*    0   */
	return count;
}

/*2.2.2 N!          1   */
/*       1,  ,           0,  ,          2    */
int DutPositionOf1InFactorialN(int n)
{
	if (n <= 0)
		return 0;

	int count = 0;

	/*1-N   x         :N/x + N/x2 + N/x3 +...,             */
	while (n)
	{
		count += n / 2;
		n /= 2;
	}

	return count + 1;
}

좋은 웹페이지 즐겨찾기