...从1开始每隔一个删去一个(删2,4,6,8...开始),最后剩下的数是多少...

发布网友 发布时间:2024-10-23 08:19

我来回答

3个回答

热心网友 时间:2小时前

这是约瑟夫环问题,就是从1开始数数,然后每数到2就从这个圈里吧这个人踢出去,然后从新开始数. 比如:1,2这时候第二个人数到了2所以踢掉2,然后第三个人数1,第四个人数2,然后把第四个人踢掉,以此类推,直到剩下一个人为止,查看那个人的编号即可. 根据这种思想,我们应该建立一个链表,这个链表是圈,有999个节点,然后从中开始重复上述动作即可,伪代码如下(具体的你自己想把,太晚要睡觉,这个算法网上很多):

typedef struct Node{
int iSerial;
struct Node *next;
}*node,head;

void main()
{
node pNode,pNextnod;
head *Head;
int i = 2;
int iCount = 1;
pNode = (node)malloc(sizeof(head));
pNode->iSerial = 1;
Head = pNode;

for(;i <= 999; i++)
{
pNextnod = (head*)malloc(sizeof(head));
pNextnod->iSerial = i;
pNode->next = pNextnod;
pNode = pNode->next;
}

pNode->next = Head;
pNode = pNode->next;

while(head != NULL || pNode != NULL || pNextnod != NULL)
{
while(iCount != 2)
{
pNextnod = pNode;
pNode = pNode->next;
iCount ++;
}
iCount = 1;
pNextnod->next = pNode->next;
printf("%d ",pNode->iSerial);
free(pNode);
pNode = pNextnod->next;
}
}
其实在这里,如果你的间隔是1的话就不需要那个while(iCount != 2)的循环了,直接运行里面的然后往下走就好了.
二半夜的我打了这么久,可能会有错,但是你也给点分我啊.

热心网友 时间:1小时前

我觉得是999吧!
因为删完2,4,6,8,……
就开始删1,3,5,7,……
最后就是999吧!

热心网友 时间:1小时前

剩500 975不对 隔一个删一个 其实就是总数除与2加1
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com