我正在网上参加一个小型的编程竞赛。基本上我所做的就是解决任务,编写算法并发送我的代码,由竞争对手的服务器自动评估。
服务器接受各种编程语言。所有任务基本上都要求程序从终端获取输入并输出正确的终端。所以在竞争对手的网站上,我注意到他们支持的语言之一是C ++,他们使用g ++来编译它。好吧,因为我不是那么流利的C ++,而不是C,我以为我会用C回复我的答案。
这对第一项任务非常有用。但是在第二个任务中,我经常达到为程序执行时间设置的限制(2秒)
这是我的C代码:
POLLPRI
所以我的算法在#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <stdlib.h>
uint8_t get_bit(uint64_t k) {
...
}
int main(int argc, char *argv[]) {
uint64_t n;
uint64_t k;
scanf("%u", &n);
uint64_t i;
for (i = 0; i < n; i++) {
scanf("%u", &k);
printf("%d\n", get_bit(k));
}
return 0;
}
中定义。
服务器在我的程序上运行3个不同的测试,具有不同的值,大多数增加以使程序运行更长时间。
但是,由于运行时间超过2秒,因此C中的此代码未通过测试。几个小时尝试不同的解决方案无济于事,我终于尝试使用一些不同的打印方法将我的代码作为C ++提交。
这是我的C ++主要版本(程序的其余部分基本保持不变):
get_bit
当我提交此代码时,所有测试都在几百毫秒内完美运行。请注意,我没有在int main(int argc, char *argv[]) {
uint64_t n;
uint64_t k;
cin >> n;
uint64_t i;
for (i = 0; i < n; i++) {
cin >> k;
cout.operator<<(get_bit(k)) << endl;
}
return 0;
}
中更改我的算法,只修改了打印。
为什么在C ++中打印比在C中打印快得多? (在我的情况下,速度提高了10倍) 如果可能的话,我怎样才能在C中实现这些速度?您可能会注意到,我不熟悉C ++,之前的代码主要是复制粘贴。出于这个原因,我更愿意用C编程。
提前谢谢。
答案 0 :(得分:6)
可能是因为您的代码 可能(请参阅注释)不正确。您无法将%u
与scanf
和64位整数一起使用。
在此处查看第三个表http://www.cplusplus.com/reference/cstdio/scanf/。你应该像%llu
一样使用。