Tôi đang cố giải bài tập này từ www.spoj.com: FCTRL - Giai thừa
Bạn không thực sự phải đọc nó, chỉ cần làm điều đó nếu bạn tò mò :)
Đầu tiên tôi triển khai nó bằng C ++ (đây là giải pháp của tôi):
#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;
}
Tôi đã tải nó lên làm giải pháp cho g ++ 5.1
Kết quả là: Thời gian 0,18 Mem 3,3M
Nhưng sau đó tôi thấy một số bình luận cho rằng thời gian thực thi của chúng nhỏ hơn 0,1. Vì tôi không thể nghĩ về thuật toán nhanh hơn, tôi đã cố gắng triển khai cùng một đoạn mã trong 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;
}
Tôi đã tải nó lên làm giải pháp cho gcc 5.1
Lần này kết quả là: Thời gian 0,02 Mem 2,1M
Bây giờ mã gần như giống nhau , tôi đã thêm vào std::ios_base::sync_with_stdio(false);
mã C ++ như được đề xuất ở đây để tắt đồng bộ hóa với bộ đệm stdio của thư viện C. Tôi cũng chia printf("%d\n", num_of_trailing_zeros);
đến printf("%d", num_of_trailing_zeros); printf("%s","\n");
để bù đắp cho cuộc gọi gấp đôi operator<<
trong cout << num_of_trailing_zeros << "\n";
.
Nhưng tôi vẫn thấy x9 hiệu suất tốt hơn và sử dụng bộ nhớ thấp hơn trong mã C so với C ++.
Tại sao vậy?
BIÊN TẬP
Tôi đã sửa unsigned long
thành unsigned int
mã C. Đáng lẽ ra unsigned int
, kết quả được hiển thị ở trên có liên quan đến unsigned int
phiên bản ( ) mới.