由于超时,Hackerrank不接受我的代码,如何优化这件作品?

时间:2016-04-02 04:32:20

标签: c optimization

问题陈述是:

  

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;
}

1 个答案:

答案 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;
}