기본 콘텐츠로 건너뛰기

1676 : 팩토리얼 0의 개수 [C++]

처음 생각한 방법은 5마다 0이 하나씩 늘어난다는 가정이었다.

4! = 24, 5!  = 120
9! = 362880, 10! = 3628800
14! = 87178291200 15! = 1307674368000

근데 100을 넘어서부터는 하나씩 더 추가되나보다.. 틀렸다고 나왔다.

두번째로 생각한 방법은 뒤의 0만 세는 조건이므로 그 앞의 숫자를 저장해놓고 그 숫자로

만 계산을 하는 방법을 생각했다. 결과는 정답!

1) 마지막 숫자를 Number에 저장해놓고 팩토리얼을 진행한다.

2) 10으로 나눈 나머지가 0이라면(뒤에 0이 있다면) 계속 제거하고 아니라면

3) 마지막 숫자만 남긴 뒤(10으로 나머지 처리한 후) 반복문 탈출. 

long long Factorial(long long num)
{
 int Count = 0;
 int Number = 1;

 for (long long i = 2; i <= num; i++)
 {
  Number *= i;
  while(true)
  {
   if ((Number % 10) == 0)
   {
    Number /= 10;
    Count++;
   }
   else
   {
    Number %= 10;
    break;
   }
  }
 }
 return Count;
}
<소스 코드>

*Source of the problem = https://www.acmicpc.net/problem/1676
*문제 출처 : BAEKJOON ONLINE JUDGE

댓글

이 블로그의 인기 게시물

11401 : 이항계수 3 (Dynamic Programming, Divide and Conquer) [C++]

1번, 2번 문제들과 확연히 차이나는 입력의 범위. 400만 ! DP를 사용해서 풀 수 없는 문제이다 . 하지만 DP가 쓰이긴 한다! 수학은 너무 어렵다. 곱셈의 역원을 공부해보다가 모르겠어서 도움을 구했다. 왜 곱셈의 역원을 구해야하는가? N! / (K! * (N-K)!) 에서 K! * (N-K)! 의 역원을 구해야 하기 때문! 곱셈의 역원을 구하는 정리인 페르마의 소정리를 이용하면 p가 1000000007 이지만 분할 정복을 이용한 제곱 수 계산 덕분에 logP 시간 소요. 분할 정복을 이용한 제곱 수 계산은 계속 써먹을 것 같아서 따로 올려놓았다. DP가 쓰이는 부분은 구해준 400만의 역원을 바탕으로 모든 역원을 구하는 부분이다. 그러므로 총 시간 소요는 O(N+LogP) long long BinomialCoefficient :: GetNum ( int N , int K ) { this - > Factorial [ 1 ] = 1 ; for ( int i = 2 ; i < = 4000000 ; i + + ) this - > Factorial [ i ] = ( this - > Factorial [ i - 1 ] * i ) % P ; this - > Invert [ 4000000 ] = this - > Pow_DC ( this - > Factorial [ 4000000 ] , P - 2 ) ; for ( int i = 4000000 - 1 ; i > 0 ; i - - ) this - > Invert [ i ] = ( this - > Invert [ i + 1 ] * ( i + 1 ) ) % P ; if ( N = = K | | K = ...

1978 : 소수 찾기 [C++]

# include < iostream > # include < vector > using namespace std ; int main ( ) { cin . tie ( NULL ) ; vector < int > Primes ; Primes . push_back ( 2 ) ; Primes . push_back ( 3 ) ; for ( int i = 4 ; i < 1000 ; i + + ) { bool IsPrime = true ; if ( i % 2 = = 0 | | i % 3 = = 0 ) continue ; for ( int j = 4 ; j < i ; j + + ) { if ( i % j = = 0 ) { IsPrime = false ; break ; } } if ( IsPrime ) Primes . push_back ( i ) ; } int N , Count = 0 ; cin > > N ; for ( int i = 0 ; i < N ; i + + ) { int Input ; cin > > Input ; for ( int j = 0 ; j < Primes . size ( ) ; j + + ) if ( Input = = Primes [ j ] ) Count + + ; } cout < < Count < < " \n " ; return 0 ; }