谁买单,猴子选大王等类似题目不同解法!!!
题目描述
三五好友,相邀畅谈,围一圆桌,饭后报数,以决买单。从第一个人开始报数(从1到3报数)凡报到3的人就不用买单,退出圈子。问最后留下要买单的是原来第几号的人。
输入
多组测试数据,输入整个n( n < 50 ),表示n个人。
输出
输出买单的人。
样例输入
8
样例输出
7
---------------------------------------------------------------------------------------------
题目比较简单,就是把一个个的数组找到一个数就向前移一个;
直接上代码
#include <cstdio>
//#define _OJ_
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int a[100];
int i, j, n, cnt = 0;
scanf("%d", &n);
for(i = 1;i <= n; i++)//每个都按顺序赋值
a[i] = i;
i = 1;
while(i <= n) {
cnt++;
if(cnt == 3) {
for(j = i;j <= n; j++)//逐个向前移一个
a[j] = a[j + 1];
cnt = 0; n = n - 1;
}
else
i++;
if(n == 1) break;//n == 1结束
if(i > n) i = 1;//返回第一个
}
printf("%d\n", a[1]);
return 0;
}
-----------------------------------------------------------------------------------------------
题目描述
m只猴子要选大王,选举办法如下:所有猴子按照1..m编号站成一个圆圈,从1号开始按照1、2、3……n报数,凡报到n的猴子退出到圈外,如此循环,直到圆圈内只有一只猴子时,这只猴子为大王。 其中:0<m,n<100
输入
m和n。
输出
大王猴子的编号。
样例输入
4 2
样例输出
1
---------------------------------------------------------------------------------------------
此题目和上面的题目大同小异,不过除了可以用循环来做之外学了数据结构还可以用循环链表来做;
这样围成一个圈更加的形象;
------------------------------------------------------------------------------------------
#include <cstdio>#include <cstdlib>#define _OJ_typedef struct Lnode{ int data; struct Lnode *next;} Lnode, *Linklist;void Creat_List(Linklist L, int n){ int i; Linklist p, head; head = L; L->data = 1; for(i = 2;i <= n; i++) { p = (Linklist) malloc (sizeof(Lnode)); p->data = i; head->next = p; head = p; } head->next = L; }void Delete_List(Linklist L){ L->next = L->next->next;}/*void fun(Linklist L, int n){ //printf("n==%d\n",n); int i = 1; Linklist p; p = L; while(i != n - 1) { //printf("%d\n",p->data); i++;//printf("i==%d\n",i); p = p->next; } Delete_List(p);}*/int main(int argc, char const *argv[]) {#ifndef _OJ_ //ONLINE_JUDGE freopen("input.txt", "r", stdin);#endif int i = 1, cnt = 0; Linklist L, head, p; int m, n; L = (Linklist) malloc (sizeof(Lnode)); head = L; scanf("%d %d", &m, &n); Creat_List(L,m); while (L->next != L) { if(i == n - 1) { Delete_List(L); L = L->next; i = 1; } else { i++; L = L->next; } } printf("%d\n", L->data); return 0;} -----------------------------------------------------------------------------------------------------------------------

浙公网安备 33010602011771号