挑出奇数

时间:2012-07-19 17:18:53

标签: c

我想编写一个方法,返回尚未删除的最后一个奇数位置。例如


Say the number inputted to function is 5 Then we can number as follows 1,2,3,4,5


After first pass, numbers left are - 2,4. 1,3,5 have been removed After second pass - 2 has been removed and so we are left with 4


The function should return 4。在我的方法中,我创建了一个n个数字的数组。每个元素可以具有值0或1,0表示该元素未被删除而1被删除。我的代码是


int findposition(int n)
{
int barr[n];
int count=0,i,begIndex=0;

for(i=0;i<n;i++)
    barr[i]=0;

while(n!=count+1)
{
    for(i=begIndex;i<n;i=i+2)
    {
        barr[i]=1;
    }


    for(i=0;i<n;i++)
    {
        if(barr[i]==0)
            begIndex=i;
    }

}

return (begIndex+1);
}

上面的函数编译成功,但是从main方法调用时不会打印任何内容。另外,我认为我的做法有点笨拙。有没有更简洁的方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,解决方案可归结为查找输入数字的最重要部分。这只是Josephus problem with k = 2

答案 1 :(得分:1)

如果你看一下二进制位置表示法中被删除对象的索引,你会发现在第一步中你删除了所有以1为最后一位数字的数字。这给我们留下了xxxx0形式的数字,其中xxxx都是某个范围内的二进制数字。所以你会喜欢 001 0, 010 0, 011 0, 100 0。显然第二个步骤删除所有带有后缀10的数字,最后你会得到 01 00, 10 00, 11 00等。

显然,最后一个数字是具有最多尾随零的数字。

相关问题