이번엔 C++로 짰습니다. 생각보다 까다로웠네요.


결국 10=2x5인 부분이 문제니까 중간에 2랑 5를 다 빼버리고 곱한 값의 1의 자리만 남기고

팩토리얼이니까 2가 항상 5보다 많겠죠? 그니까 5의 개수가 0의 개수가 되고 남은 2 개수만큼 곱해서 1의 자리 남기기를 하면 됩니다. 풀긴 했는데 뭔가 시원치 않네요. 응용 문제의 경우 % 10을 입맛대로 바꾸면 간단히 됩니다.(앞의 3자리 수면 % 1000이라든가). 


10000!

-> 2499 8

2012!

->501 8


#include<stdio.h>


int main() {

int n;

scanf("%d", &n);

int now = 1, nZero = 0, nTwo = 0, nFive = 0;

for(int i = 2;i<=n;i++) {

int j = i;

while(j % 2 == 0) {

j /= 2;

nTwo++;

}

while(j % 5 == 0) {

j /= 5;

nFive++;

}

now = (now*j) % 10;

}

nZero = nFive;

for(int i = nTwo - nFive; i>0;i--)

now = (now*2)%10;

printf("%d %d\n", nZero, now);

}

Write your message and submit
« PREV : 1 : 2 : 3 : 4 : 5 : 6 : 7 : ··· : 10 : NEXT »