一、聪明的情侣
酋长的女儿艾丽要出嫁了,按以往的风俗习惯,要搭个高台,台下是众多的求婚者,艾丽在台上扔束花,扔在台下谁身上,艾丽就得嫁给谁。
但她担心落不到心爱的雷蒙身上。艾丽私下约雷蒙商量如何是好。雷蒙想出了一个主意……艾丽便和父亲说:“我不愿意搭台撒花,这么多人来
,挤在一起乱哄哄的,没秩序。”父亲说,“不这样也可以,但结婚时要当场在人群中决定嫁给谁,不许指名,方法你自己定。”艾丽高兴的告
诉主持人如何行事。婚日来临,人群拥挤,主持人叫求婚者排成一队,雷蒙在队外数了数队列共有101人,于是自己找了个合适的位置也站在队列
中,主持人要大家从前往后1,2,1,2……报数,报单数的退出场外,余下的人位置不变,再重新从前往后1,2,1,2……报数,报单数的退场,
如此下去最后只剩一人,艾丽便嫁给谁。大家惊奇的发现最后剩下的竟是雷蒙。请用程序回答雷蒙刚开始站在队列中的第几个位置。
思路一:
转换成链表,每次去除单数。最后剩下唯一的数,结束。
思路二:
转换为数学问题。求人数中2的阶乘最大数。 64 属于数学口算。
#include "stdafx.h" #include <stdio.h> #include <iostream> #define NULL 0 struct People { int index; struct People* next; }; struct People* head; struct People* hail; void init(int num){ struct People *p; head = (struct People*)malloc(sizeof(struct People)); hail = (struct People*)malloc(sizeof(struct People)); hail ->index = -1; hail ->next = NULL; head ->index = 0; head->next = hail; for(int i = num;i>0;i--){ p = (struct People*)malloc(sizeof(struct People)); p->index = i; p->next = head->next; head->next = p; } } void remove(struct People *people){ struct People * p; p = people->next; people ->next = p->next; //printf("remove : %d ",p->index); free(p); } int search(){ struct People *p; int num = 102; while(head->next->next->index>0){ p = head; while(p->index>=0&&p->next->index>0){ remove(p); num--; p=p->next; } //printf("remain: %d ",num); } return head->next->index; } void freeALL(){ struct People *p; while(head->next->index>0){ p = head->next; head->next = p->next; free(p); } free(head); free(hail); } /** 第二种解题思路: 直接转换为数学问题,就是求 num中2的阶乘最大的 double fun(int n) { return Math.Pow(2, Math.Floor(Math.Log(n, 2))); } */ int main() { int last; init(102); last = search(); printf("最后一个数字是:%d",last); freeALL(); getchar(); return 0; }