面试问题

时间:2014-01-06 09:15:28

标签: c# php c++

计算机科学的基础之一是知道数字如何以2的补码表示。想象一下,使用32位写下A和B之间的所有数字,包括2的补码表示。你会写下多少1?

输入: 第一行包含测试用例数T(< = 1000)。每个下一个T行包含两个整数A和B.

输出: 输出T行,一行对应每个测试用例。

约束: -2 ^ 31< = A< = B< = 2 ^ 31-1

示例输入:

-2 0
-3 4
-1 4

示例输出:

63
99
37

说明: 对于第一种情况,-2包含31 1后跟0,-1包含32 1和0包含0 1。因此,总数是63。 对于第二种情况,答案是31 + 31 + 32 + 0 + 1 + 1 + 2 + 1 = 99

1 个答案:

答案 0 :(得分:1)

for (int i=1; i<line[0]; i++)
{
    int numOf1s = 0;
    for (int j=line[i].A; j<=line[i].B; j++)
    {
        for (unsigned int n=j; n>0; n>>=1)
            numOf1s += n & 1;
    }
    printf("%d\n",numOf1s);
}