【发布时间】:2016-04-02 04:32:19
【问题描述】:
问题陈述是:
Watson 给 Sherlock 一个整数 NN 并问他:NN 中能被 2 整除的除数是多少?
输入格式
第一行包含 TT,即测试用例的数量。紧随其后的是 TT 行,每行包含一个整数 NN。
输出格式
对于每个测试用例,在一行中打印所需的答案。
约束
1≤T≤1001≤T≤100 1≤N≤109示例输入:
2\n 9\n 8样本输出:
0\n 3
我输入了 '\n' 这意味着下一个整数将在新行中。 由于超时,Hacker Rank 不会接受我的代码。请帮我优化这段 C 代码。
我的 C 代码是:
int main() {
int length,number,i,count =0;
scanf("%d",&length);
while(length--){
scanf("%d",&number);
for(i=2;i<=number/2;i++){
if(number % i == 0 && i % 2 == 0){
count = count + 1;
}
}
if(number % 2 == 0){
count = count + 1;
}
printf("%d\n",count);
count =0;
}
return 0;
}
【问题讨论】:
-
一方面,将
i循环更改为使用i += 2递增而不是i++。这样你就可以跳过所有奇数。然后你也可以摆脱i % 2 == 0测试,因为你会知道它总是正确的。 -
如果
number是奇数则不需要循环。 -
Hackerrank 上的问题叫什么名字?
-
@RajeevSingh: Here.
-
许多在线竞赛给你一个简单的问题,对于小数据集或示例中的小数字,用蛮力解决这个问题是微不足道的。当您汇总代码时,它们会向您抛出大量数字,从而使您的蛮力方法超时。挑战在于利用数据的特性来加速解决方案。您的解决方案使用蛮力。
标签: c optimization