问题陈述是:
Watson向Sherlock提供一个整数NN并问他:NN的除数是多少,可被2整除?
输入格式
第一行包含TT,测试用例的数量。接下来是 每行包含一个整数NN的TT行。
输出格式
对于每个测试用例,请在一行中打印所需的答案。
约束
1≤T≤1001≤T≤100 1≤N≤109
示例输入:
2\n 9\n 8
示例输出:
0\n 3
我输入了' \ n'这意味着下一个整数将在一个新行中。 由于超时,黑客等级不接受我的代码。请帮我优化这个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;
}
答案 0 :(得分:1)
以下是解决此问题的算法:
如果数字是偶数:
从 i = 2 运行循环直到数字的平方根,即: sqrt(number)
,并在以下两种情况下增加计数,如果我将数字分开 (number%i==0)
:
如果我是(i%2==0)
q ,其中 q=number/i
,如果我不等于q (i!=q)
并且 q甚至 (q%2==0)
因为如果我除以数字,则意味着q也将(number/q=i)
除以它。
最后将数量增加1,因为数字也会分开。
如果数字是奇数:,则数量为0
,因为没有 i(偶数)会划分奇数。
int main()
{
int length,number,i,count;
scanf("%d",&length);
while(length--)
{
scanf("%d",&number);
count =0;i=2;
if(number%2==0)
{
while(i*i<=number)
{
if(number%i==0)
{
if(i%2==0)
count++;
int q=number / i;
if (i !=q && q%2==0)
count++;
}
i++;
}
count++;
}
printf("%d\n",count);
}
return 0;
}