Bu alıştırmayı www.spoj.com adresinden çözmeye çalışıyordum: FCTRL - Faktör
Gerçekten okumak zorunda değilsin, merak ediyorsan yap yeter :)
İlk önce C ++ 'da uyguladım (işte benim çözümüm):
#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 için çözüm olarak yükledim
Sonuç şuydu: Time 0.18 Mem 3.3M
Ama sonra zaman infazlarının 0.1'den az olduğunu iddia eden bazı yorumlar gördüm. Daha hızlı algoritma düşünemediğim için aynı kodu C'de uygulamaya çalıştım :
#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 için çözüm olarak yükledim
Bu sefer sonuç şöyleydi: Time 0.02 Mem 2.1M
Şimdi kod hemen hemen aynı , buradastd::ios_base::sync_with_stdio(false);
önerildiği gibi C ++ koduna C kütüphanesinin stdio tamponlarıyla senkronizasyonu kapatmak için ekledim . Ben de bölmek için çifte çağrı telafi etmek içinde .printf("%d\n", num_of_trailing_zeros);
printf("%d", num_of_trailing_zeros); printf("%s","\n");
operator<<
cout << num_of_trailing_zeros << "\n";
Ama yine de C ++ koduna kıyasla x9 daha iyi performans ve daha düşük bellek kullanımı gördüm .
Neden?
DÜZENLE
I sabit unsigned long
için unsigned int
C kodu. Olmalıydı unsigned int
ve yukarıda gösterilen sonuçlar yeni ( unsigned int
) sürümle ilgilidir.