我想编写一个方法,返回尚未删除的最后一个奇数位置。例如
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方法调用时不会打印任何内容。另外,我认为我的做法有点笨拙。有没有更简洁的方法来做到这一点。
答案 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等。
显然,最后一个数字是具有最多尾随零的数字。