www.spoj.com에서이 문제를 풀려고했습니다. FCTRL-Factorial
꼭 읽을 필요는 없습니다. 궁금하다면 읽어보세요. :)
먼저 C ++로 구현했습니다 (여기에 내 솔루션이 있습니다).
#include <iostream>
using namespace std;
int main() {
unsigned int num_of_inputs;
unsigned int fact_num;
unsigned int num_of_trailing_zeros;
std::ios_base::sync_with_stdio(false); // turn off synchronization with the C library’s stdio buffers (from https://stackoverflow.com/a/22225421/5218277)
cin >> num_of_inputs;
while (num_of_inputs--)
{
cin >> fact_num;
num_of_trailing_zeros = 0;
for (unsigned int fives = 5; fives <= fact_num; fives *= 5)
num_of_trailing_zeros += fact_num/fives;
cout << num_of_trailing_zeros << "\n";
}
return 0;
}
g ++ 5.1 솔루션으로 업로드했습니다.
그러나 그때 나는 그들의 시간 실행이 0.1 미만이라고 주장하는 일부 의견을 보았습니다. 더 빠른 알고리즘에 대해 생각할 수 없었기 때문에 동일한 코드를 C 로 구현하려고 시도했습니다 .
#include <stdio.h>
int main() {
unsigned int num_of_inputs;
unsigned int fact_num;
unsigned int num_of_trailing_zeros;
scanf("%d", &num_of_inputs);
while (num_of_inputs--)
{
scanf("%d", &fact_num);
num_of_trailing_zeros = 0;
for (unsigned int fives = 5; fives <= fact_num; fives *= 5)
num_of_trailing_zeros += fact_num/fives;
printf("%d", num_of_trailing_zeros);
printf("%s","\n");
}
return 0;
}
gcc 5.1 의 솔루션으로 업로드했습니다.
이번 결과는 다음과 같습니다. 시간 0.02 Mem 2.1M
이제 코드는 거의 동일 합니다. C 라이브러리의 stdio 버퍼와의 동기화를 해제하기 위해 여기std::ios_base::sync_with_stdio(false);
에 제안 된대로 C ++ 코드에 추가 했습니다 . 나는 또한 in의 이중 호출을 보상하기 위해 to 를 분할 했습니다 .printf("%d\n", num_of_trailing_zeros);
printf("%d", num_of_trailing_zeros); printf("%s","\n");
operator<<
cout << num_of_trailing_zeros << "\n";
그러나 나는 여전히 C 대 C ++ 코드에서 x9 더 나은 성능 과 낮은 메모리 사용량을 보았습니다 .
왜 그런 겁니까?
편집하다
나는 C 코드에서 수정 unsigned long
했습니다 unsigned int
. 그것은 했어야 unsigned int
위에서 도시 된 결과는 새로운 (관련된 unsigned int
) 버전.