需要帮助解决涉及翻转硬币的编程问题

时间:2010-08-21 23:43:35

标签: c algorithm

我试图解决codechef.com上的翻转硬币问题(http://www.codechef.com/problems/FLIPCOIN/) 我的代码在C中,我在运行Linux的机器上使用gcc v4.4.3测试它,我的程序适用于提供的示例输入。但是,在上传到法官时,我收到“错误答案”的消息。 在我的程序中,我代表通过切换位来翻转硬币。我认为我的算法是正确的,并且我无法想出它会失败的情况。以下是我的代码。 任何帮助都会非常感激。

谢谢。

#include <stdio.h>

long int n=0,temp,number_of_coins,number_of_inputs,bit_mask;
long int number_of_ones(long int i) //Return the number of bits set
{
   return __builtin_popcountl(i);
}
int main(void)
{
    long int ctr,lower,upper,length;
    int op;

    scanf("%ld %ld",&number_of_coins,&number_of_inputs);
    length = number_of_coins-1;
    for(ctr = 0 ; ctr < number_of_inputs;ctr++) //Main loop
    {
        scanf("%d %ld %ld",&op,&lower,&upper);
        bit_mask = ((1 << length-lower+1)-1) & ~((1 << length-upper)-1);

        if(op == 0)
        {   

            n ^= bit_mask ; //Toggle the bits in the range lower to upper

        }
        else
        {
            temp = n;
            temp &= bit_mask;
            printf("%ld\n",number_of_ones(temp)); //Print number of bits set
        }


    }



    return 0;

}

2 个答案:

答案 0 :(得分:6)

由于您使用存储在long int中的位序列来表示硬币,因此您的代码将无法使用超过32个硬币(或许多位在long中)。该网站指定最多可以有100000个硬币。

答案 1 :(得分:0)

检查结果的CodeChef方法可能存在问题,因为我也得到了相同的答案。您的代码没有问题。