c# - 面试题

标签 c# php c++

计算机科学的基础之一是了解数字如何用 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/

相关文章:

php - 如何通过使用 join 2 次或更多次随机选择 2 行

c++ - 带有 ifstream 和 ofstream 的可变文件名

c++ - 调试关于排列的程序

c# - 使用 1 个表单和大量函数在 C# 中组织代码

c# - 如何将 innerHtml 输入到输入(使用 TagHelper 生成)?

php - 在 .htaccess 中重写规则 - 波斯语的正则表达式

c++ - AX 解析器生成器和 mingw gcc 4.6 运算符 &

c# - 没有语法高亮

c# - 在 C# 中用鼠标拖动来移动控件

mysql - 只获取今天的帖子?