私はwww.spoj.comからこの演習を解決しようとしていました:FCTRL-階乗
あなたは本当にそれを読む必要はありません、あなたが興味を持っているならそれを読んでください:)
最初に私はそれを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;
}
gcc5.1のソリューションとしてアップロードしました
今回の結果は以下のとおりであった:時間0.02 Memの2.1M
これでコードはほぼ同じになりましstd::ios_base::sync_with_stdio(false);
た。ここで提案したようにC ++コードに追加して、Cライブラリのstdioバッファーとの同期をオフにしました。また、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
)バージョンに関連しています。