计算机科学的基础之一是了解数字如何用 2 的补码表示。想象一下,您使用 32 位以 2 的补码表示形式写下 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
最佳答案
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);
}
关于c# - 面试题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20946558/