ฉันพยายามแก้แบบฝึกหัดนี้จาก 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.18 Mem 3.3M
แต่แล้วฉันก็เห็นความคิดเห็นบางส่วนที่อ้างว่าเวลาดำเนินการน้อยกว่า 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
ตอนนี้รหัสเกือบจะเหมือนกันฉันได้เพิ่มstd::ios_base::sync_with_stdio(false);
รหัส C ++ ตามที่แนะนำไว้ที่นี่เพื่อปิดการซิงโครไนซ์กับบัฟเฟอร์ stdio ของไลบรารี C ฉันยังแยกprintf("%d\n", num_of_trailing_zeros);
ไปprintf("%d", num_of_trailing_zeros); printf("%s","\n");
เพื่อชดเชยสำหรับการโทรคู่ในoperator<<
cout << num_of_trailing_zeros << "\n";
แต่ฉันยังเห็นประสิทธิภาพที่ดีขึ้น x9และการใช้หน่วยความจำลดลงในรหัส C เทียบกับรหัส C ++
ทำไมถึงเป็นเช่นนั้น?
แก้ไข
ฉันคงunsigned long
ไปunsigned int
ในรหัสซี ควรจะเป็นunsigned int
และผลลัพธ์ที่แสดงไว้ด้านบนเกี่ยวข้องกับunsigned int
เวอร์ชันใหม่ ( )