我的Inspect Bits函数代码

时间:2017-07-11 04:01:15

标签: c

以下代码适用于https://www.testdome.com/for-developers/solve-question/9780

中给出的测试样本

问题是:实现inspect_bits函数,该函数检查给定数字是否在其二进制表示中包含2个或更多个连续的。如果是,则该函数应返回1.否则,它应返回0.

例如,inspect_bits(13)应返回1,因为它在其二进制表示(1101)中包含2个连续的。

我的代码是:

#include <stdlib.h>
#include <stdio.h>

int inspect_bits(unsigned int number)
{
    unsigned int ref = 1;
    int comp;

    for (int i = 0; i< sizeof(number) * 8; i++)
    {
        int a = number& (ref << i);
        printf("%d: a is %d\n", i, a);
        int b = number& (ref << (i + 1));
        printf("%d: b is %d\n", i, b);
        if ((a != 0) && (b != 0))
        {
            return 1;
        }
    }
    return 0;
}

#ifndef RunTests
int main()
{
    printf("%d", inspect_bits(13));
}
#endif  

结果似乎没问题,但系统告诉:   各种数字:错误答案

你能帮忙修改我的代码吗?

此致

3 个答案:

答案 0 :(得分:1)

说实话,我认为这是测试网站本身的问题。您的代码会为每个给定的测试用例返回正确的结果,我甚至修改了代码:

int inspect_bits(unsigned int number)
{
    for (int i = 0; i < sizeof(number) * 8; ++i) {
        if (((number & (1 << i)) != 0) && ((number & (1 << (i + 1))) != 0)) {
            return 1;
        }
    }
    return 0;
}

测试用例返回1,其中有2个二进制值在一起,适用于3及以上;但是,在测试站点上运行代码,它会出现各种数字测试失败的错误。

有趣的是,使用此代码:

int inspect_bits(unsigned int number)
{
    while (number >= 3) {
        if ((number & 3) == 3) { return 1; }
        number >>= 1;
    }
    return 0;
}

这基本上是一回事,只对一个数字使用位移,测试通过100%..

您可以提交电子邮件解释错误;但除此之外,我不确定它还能是什么。

希望有所帮助。

答案 1 :(得分:0)

int flag = 0;
int inspect_bits(unsigned int number)
{
int *arr;
int i = 0;
number = convert(number);
while(number)
{
arr[i] = number % 10;
number /= 10;
i++;
}
for(int j = 0; j < i-1; j++)
{
    if(arr[j] == arr[j+1])
    {
        flag = 1;
        return flag;
    }
}
return flag;
}

int convert (int num)
{
if(num == 0)
{
    return 0;
}
else
{
    return (num % 2 + 10 * convert(num / 2));
}
}

这就是我所做的,它说的是“各种单词:错误答案”。测试站点似乎有问题。他们网站上的其他一些问题对问题的评价不正确。我遇到的都是C程序。根据我的经验,C ++可以很好地工作。

答案 2 :(得分:0)

根据我在testdome中的经验,几乎所有的运动权解决方案都与算法的效率有关

此代码对我有用:

#include <stdlib.h>
#include <stdio.h>

int inspect_bits( unsigned int number ) {
    do {
      if( ( number&3 )==3 ) return 1;
    } while( number>>=1 );
    return 0;
}

#ifndef RunTests
int main () {
    printf( "%d", inspect_bits( 13 ) );
}
#endif

在发布的代码中,for循环检查函数输入参数'number'中的所有位。效率还不够。

关键是我们不必等到完整的数字完全右移。

他们说,我们必须检查其二进制表示中是否有2个或更多连续的位,换句话说,如果找到至少2个连续的位,且值为1,则函数返回1,而较少的值连续2个位是十进制3(3 = 0b00000011)。

因此,我们可以使用与门将数字与3进行比较,然后将其右移至“数字”进行检查,直到它发生为止。

让我们使用与示例中不同的数字:

221 = 0b11011101 we just only need to compare 3 times and shift it 2 times.

  0b11011101 (221)
& 0b00000011 (  3)
------------------
= 0b00000001 (  1)

  0b11011101(221) >> 1  = 0b01101110(110)
0b01101110 (110) & 0b00000011 ( 3) ------------------ = 0b00000010 ( 2) 0b01101110(110) >> 1 = 0b00110111(55) 0b00110111 (55) & 0b00000011 ( 3) ------------------ = 0b00000011 ( 3) ----> FOUND! return 1