三五好友,相邀畅谈,围一圆桌,饭后报数,以决买单。从第一个人开始报数(从1到3报数)凡报到3的人就不用买单,退出圈子。问最后留下要买单的是原来第几号的人。
三五好友,相邀畅谈,围一圆桌,饭后报数,以决买单。从第一个人开始报数(从1到3报数)凡报到3的人就不用买单,退出圈子。问最后留下要买单的是原来第几号的人。
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;
}
原文:http://www.cnblogs.com/airfand/p/5005796.html