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

C 需要帮助解决这个涉及硬币翻转的编程问题吗,c,algorithm,C,Algorithm,我正在尝试解决codechef.com()上的硬币翻转问题 我的代码是C语言的,我在运行Linux的机器上使用gcc v4.4.3对其进行了测试,我的程序适用于提供的示例输入。然而,在上传给法官时,我得到了“错误答案”的信息。 在我的程序中,我通过位的切换来表示硬币的翻转。我认为我的算法是正确的,我不能想出一个失败的例子。下面是我的代码。 任何帮助都将不胜感激 多谢各位 #include <stdio.h> long int n=0,temp,number_of_coins,num

我正在尝试解决codechef.com()上的硬币翻转问题 我的代码是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;

}
#包括
长整数n=0,温度,硬币数,输入数,位掩码;
long int number_of_one(long int i)//返回设置的位数
{
返回内置的popcountl(i);
}
内部主(空)
{
长内中心,下部,上部,长度;
int op;
scanf(“%ld%ld”、”硬币数量“、”输入数量“);
长度=硬币的数量-1;
对于(ctr=0;ctr<输入的数量;ctr++)//主循环
{
scanf(“%d%ld%ld”、&op、&lower和&lower);

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

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

存储在
long int
中的位序列表示硬币,您的代码不能处理超过32个硬币(或
long
中的位数)但是,该网站规定最多可以有100000枚硬币。

由于您使用存储在
长整数中的位序列来表示硬币,因此您的代码不能处理超过32枚硬币(或者
长整数中的位数是多少)但是,该网站规定最多可以有100000个硬币。

该网站是否希望您的程序在打印输出之前一次获取所有输入行?您认为名为
\uuuu builtin\u popcountl
的函数是可移植的?我认为情况并非如此,因为我以前提交过一些解决方案,但我没有提交事先获取所有输入。程序应该从输入流读取并写入输出流@Borealid:在线法官使用的是gcc v4.3.2。这会导致问题吗?网站是否可能希望您的程序在打印输出之前一次获取所有输入行?您认为名为
\u的函数是内置的_popcountl
是可移植的吗?我认为情况并非如此,因为我以前提交过一些解决方案,但我没有事先获取所有输入。该程序应该从输入流读取数据并写入输出流@Borealid:online judge使用的是gcc v4.3.2。这会导致问题吗?这是正确的。您可以跟踪10000 bi手动输入并占用大量内存,或者您可以使用间隔的链接列表。@mathepic:“或者您可以使用间隔的链接列表”…对于010101010101这样的序列,我会占用大量的内存。这是一个很好的观点,但我认为链表平均占用的内存会更少…不太确定。谢谢你的回答。请有人解释一下,我如何使用从索引0到索引99999的间隔的链表来表示以下3个步骤1)位被翻转2)然后从索引400到索引500的位被翻转3)最后,从索引4到索引10的位被翻转。这是正确的。您可以手动跟踪10000位并占用大量内存,或者您可以使用间隔的链接列表。@mathepic:“或者您可以使用间隔的链接列表”…对于010101010101这样的序列,我会占用大量的内存。这是一个很好的观点,但我认为链表平均占用的内存会更少…不太确定。谢谢你的回答。请有人解释一下,我如何使用一个间隔为1)从索引0到索引99999的位被翻转2)然后位的链表来表示以下3个步骤从索引400到索引500被翻转3)最后,从索引4到索引10的位被翻转。