2014-01-06 13 views
1

计算机科学的基础知识之一就是知道数字是如何用2的补码表示的。想象一下,用32位补码表示法写下A和B之间的所有数字。你会写多少个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

+0

快速...任何人回答与逻辑这个问题? – user3164808

+5

只是尽你所能地回答;面试通常与你的想法一样多 - 如果我在互联网上发现面试者问我面试问题......坏事。最糟糕的情况下,你需要2件事情;一个for循环和一个“计数位”的方法...如果有更好的情况:很好 –

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