鱼C论坛

 找回密码
 立即注册
查看: 3580|回复: 4

猴子问题

[复制链接]
发表于 2011-10-2 03:45:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好!7 y% w- y- ~' O/ [
这几天我在忙着编一个问题,我用了一种方法编出来!
) O/ p) Z' _: e7 A但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
6 Y1 m- A7 g9 m' a6 ~注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 / W7 ^! }- v% ]- C, l

) @( }* w' |0 w4 D/ d' j+ j' }. Z1 n# N  p; U
                            题目
5 f. H/ _5 P9 I* h$ [1 I山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" }$ s+ P( z% _  n3 O4 w" g
第一种方法:利用循环链表
4 o* l, O- h# ^/ V#include<stdio.h>$ y7 P" Q( W0 h" a0 X5 X& I8 N  \
#include<malloc.h>6 D/ \) K$ m/ g' ?
#define M 8            //共有8只猴子5 A& e5 V- B2 r) I! B9 L, k
#define N 3            //数到3只时退出第三只5 C- f+ p2 p( H7 b, r! m$ U8 Y% ~+ y
typedef struct monkey, M& ]/ r) N9 \& E
{int number;) N5 L9 b, N4 z4 {8 `
int flag;( _$ U! v! u- P6 p3 `3 E6 H
struct monkey* next;1 _, R, Y. A& }3 H3 j" E3 N! `
}MONKEY;
* h5 }" S0 `, S$ L* q/ Cmain()
; Q, [0 M/ f8 V7 B( s- L9 L{ MONKEY *head=NULL,*p,*s;* j/ U8 S: ?* N* A  @6 P- B
  int i,sum=0,count=0;
! l5 K5 U7 p2 V5 Y, Y+ L  clrscr();              //清屏
6 @1 W, f# h5 Q0 v( C( z- m$ N5 N  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存) z" X( Z- S+ e$ A/ N  Q- q' j" H
  p->number=1;p->flag=1;6 l! ^5 p, Q9 T, y. ]% Y
  p->next=head;4 Z. k7 K; ^4 q" U. e
  head=p;+ X. v2 @% j8 r& Z( V
  for(i=2;i<=M;i++)! Z, i: ?9 p* U1 d1 B
    { s=(MONKEY *)malloc(sizeof(MONKEY));, J! L: t2 F% a7 W) C8 s  A( O  J, p
     s->number=i;s->flag=1;
3 P8 ?) ^2 O/ d9 Y( b( A5 D4 i7 k     s->next=head;
+ A* {8 z( |" Y1 s     p->next=s;p=p->next;
" c9 p$ ~& h+ _8 M) c' E: f; d    }2 s4 Q6 @5 k, A3 |* N
    p=head;
" Y7 G8 F' L3 r9 D* O' U; A2 c   for(;;)
! d# s' |$ [6 \& O3 H! x# o8 \    {if(p->flag==1)
& A$ S" }; _9 V% {/ x- I3 W- p       count++;
* b9 V8 d4 x& o4 I     if(count==N)
' n# ^' @) x. d$ Z" ?) l        {p->flag=0;
6 `5 o" r& V. t2 P# j- I         count=0;' b0 `/ M8 }: C2 U
         sum++;}
; c- Y" K" L& F5 C, I8 v" a# e     if(sum==M-1)1 [& {3 d+ P: F& }0 h+ }& j
        break;
) s) W' r$ I/ A     p=p->next;* D% d5 S  d+ A, K9 C% ^4 @$ T# _
    }
% @" Y: f- F& a9 w6 M! |    p=
" L" x+ c+ P% L1 m    head;/ X7 j% K) |* y+ X* J3 |. w& X
    for(i=1;i<=M;i++); k$ r9 y1 M' G2 O1 D+ ?" S( Y: u2 |
    { if(p->flag==1)" D& J9 s" e8 O, x( H/ Q1 x% b6 ~5 {
        printf("\t%d",p->number);
* ^- D2 |4 E! D      p=p->next;; |0 P" P; L5 z
    }
& {  |1 D8 L2 |" `
& J' s' ]2 x( A: o6 q2 i* @1 g0 i9 a3 l
0 c# b( S( D+ \% s% R
}
# c$ N6 ~6 f2 b$ v% R
第二种方法:数组
* Y' ?" Y0 `( g' C#include<stdio.h>0 `7 g  i' T# o0 h* v# P) ^
#define M 81 L( ?! J; @' w
struct monkey
2 {$ o$ ?( D- v" U! o0 w{int number;0 f! t8 n8 K4 l" d( _7 a/ F5 a
int nextp;
8 }9 v- p4 X' l0 D1 x0 Z1 a}link[M+1];2 M! E4 G5 k* b- M

/ ~# d8 p4 t& A3 Dvoid main()8 C6 t# v$ Z5 X
{int i,count,h;$ j7 a0 B' X# c0 X& [
for(i=1;i<=M;i++)
) M: x7 y7 {" x- E( g/ p, e6 A{  if(i==M)4 F. w1 M" G2 y4 C5 i
   link[i].nextp=1;  u& O( w3 @, H! i$ C
   else
5 A7 S: Z3 U) s. _# l5 C   link[i].nextp=i+1;
, z  v9 o! J; |% j9 N5 [  link[i].number=i;
; O7 u# q2 \) z9 D. s}+ \1 }% C6 O4 M6 {. m
printf("\n");# ]: w  }. F6 h+ r
count=0;. c! u4 D/ ~2 w% S8 d. D
h=M;
: ^" v8 o2 T/ m1 V& u2 l' W1 oprintf("依次退出的猴子: \n");
1 d, U/ G+ C) X8 u* P8 awhile(count<M-1)  c5 D, e1 @" S$ r, M( _- t
{i=0;
' G5 w* f  \0 n% U, D) pwhile(i!=3)! R( y7 n1 t3 U. r: J
{ h=link[h].nextp;1 L$ T: c- |& E
   if(link[h].number)
9 G  o/ y7 `3 ^% J' m     i++;}2 K1 Z7 C8 E* d: \+ U5 S

% F: n  i3 g  m# U. n/ Cprintf("%4d",link[h].number);
+ B& K0 W7 J5 P+ Q/ l: X: N% Wlink[h].number=0;
9 {  c7 q' o9 o4 P7 d0 \count++;
! {1 T/ H1 U+ l& V7 c}
; n8 Q4 m; w9 G+ |) `( Z2 Z
; T% k$ e/ J, {& S* iprintf("\n大王是:");8 T" d9 K9 ~0 y9 `) `
  for(i=1;i<=M;i++)2 s# E1 G- @- a) X$ E
  if(link[i].number)
/ V: D. M; d" n7 J: x5 u    printf("%3d\n",link[i].number);
2 `3 B& b4 Q, A6 r. m1 v6 @7 m" }. i; [& B. b+ w( X1 b4 g

* I9 I! A6 G/ q5 Z) r}
% s+ \2 |7 Q+ E0 N; S
第三种是普通方法for循环

6 ?; q5 u# ~& O! x, n#include<stdio.h>& C5 X  n4 x: n' {( Y
void main(): I, H6 u5 H+ r6 B
{ int i,k,m,n,num[50],q,*p;
4 P$ M4 ^" b/ M! K' F  b; Y& _    clrscr();! Z% D+ I; z, [5 C8 O- [3 P" g4 |
   printf("input number of person: n=");' ]! ~' n& k3 [& p
    scanf("%d",&n);" O, d. r( `& n' t4 H( x/ `& M
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
8 I% p9 [5 O2 P    scanf("%d",&q);
. r0 y9 F/ l9 N3 Z- h) `, a0 u9 O; M   p=num;
& \) G4 Z1 [3 C+ X  for(i=0;i<n;i++)4 R8 R+ L: Z3 H9 _0 |6 N7 f
    *(p+i)=i+1;: p; b- ]' b6 m+ P+ C
   i=0;
7 l/ C. o0 }+ F  w* H   k=0;
9 r, q3 u3 H# k   m=0;
5 t, h0 y( H; u/ }/ n6 M  while(m<n-1), y6 _/ w/ N. d2 Z: P! c. [
   {if(*(p+i)!=0) k++;
; j& O: E, y& v0 a     if(k==q)- [# y4 J+ e7 J  g0 K: b
      { *(p+i)=0;
6 J5 Z- k) e7 F- _        k=0;
  t% h) }6 X  E8 R3 r  o        m++;
0 `$ J3 k% P2 U$ v: d/ M- E$ s      }
1 v: }) O9 Q( g: |5 x    i++;
* o2 P/ l2 j) y+ n, ?" O- J) c    if(i==n)i=0;% [+ d( B+ ]# M: b
   }0 P6 _1 f8 d7 K- W# F
  while(*p==0)p++;9 s( |% @" G; K. [2 L, a0 G
    printf("The last one is NO:%d\n",*p);) `) c* z7 L. z  X! ~
     getch();7 ^! G/ P3 ^& L6 j! D4 O

; A7 W7 D; g; R: y1 s}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;+ W; E! A* `% V6 G
namespace 又费马达又费电
) Z" x( Q% B0 O{
7 B; A( z/ K3 U. `( l    class Program9 `0 t0 U1 a: k' I2 g
    {: i& M6 H. E1 F& |! ^/ E$ i
        static void Main(string[] args): l4 l! T4 X' O0 I' ]; _( j
        {
- a  L2 u; `6 N  i' x+ d            int m, n;. \% m$ [4 H+ _& ~9 l4 B6 T; c
            Console.WriteLine("请输入数组长度");
3 w7 C% {1 `2 S( G+ C5 F+ p' O( o            m = int.Parse(Console.ReadLine());//m为数组的大小: t, |& y  y6 P3 M* I
            Console.WriteLine("请输入要截取数字的大小");& w3 ^8 C5 \8 q; Q; k3 ^8 q
            n = int.Parse(Console.ReadLine());
& g6 t7 G. n# r# O. T& b            int [] numw=new int! o( x/ q) \3 G- U: z
; c$ L3 Y, c' y' t
&shy;&shy;&shy;;
! b# u; s7 \4 K- j            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. V1 Y( C$ p) G/ c5 @7 D1 E
            {
- h# c# Z! J# b* h+ F( |$ |                numw[j - 1] = j;
, o9 L) X; p+ Q! J2 y1 Z            }
1 C5 T8 k6 Y% Q9 E% g' X3 T7 N            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
. |2 {* H( I* [0 v3 A/ S            while (d != m - 1)7 L( l  l  Z0 k" a- [
            {  l" z* |6 r; k: P, c- V& J" c
                if (i == m && d != m - 1)
( ^/ {+ e  M6 T                {
. L% u. B; t3 @                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
2 J0 q5 P  m9 Z5 Y8 ^# _                    continue;! z- z5 U) @% z# I( A; s: R3 ]
                }
9 q" F( y$ o& d$ r5 ~                else" b; C8 v" }6 a
                {  n/ W! n3 \2 c5 o
                    if (numw[i] != 0)
3 O2 u1 X$ [3 C$ Q; G9 Y' g3 t                    {
+ r; @" E$ `8 o6 c                        i++;6 u1 r4 P! y4 ], ]' y! U' T- S
                        k++;, S6 ]2 E3 W5 i3 b. \( r) b( w6 c; m
                        if (k == n)' U3 W" b- @" H
                        {
# r( l7 O7 O. |% j# r2 n                            numw[i - 1] = 0;//把在n位置数组元素的值改变了7 f+ L5 ]2 d* V0 V8 m9 |$ A9 w: [
                            k = 0;
8 f1 Z+ L7 }: A9 i7 x              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小14 C; m" S. l, V/ u) K
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 g$ [$ E* G& p$ E: x! ~
                        }
" r( k7 M, e: B9 s; n* M$ E                        else//输出暂时还没有改变数组元素的值4 p& a6 w* w, L; t; ~$ S! b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
4 I5 x" X, T  q* n2 B                    }
- r" [* w2 y4 ~$ u                    else( g5 `1 G" F" L
                        i++;//数组元素为0,直接跳过,不计数。。。
7 {/ A  p, a1 V                }, f8 X& d5 w) f; Z0 C3 f1 z2 y, `# Q
7 ?' I! t' C; U& S1 [$ ?" R! g: s

  N3 W- s  A* u0 F* j  w            }//结束while循环8 n+ e  S: I1 T& N2 Y* R8 j
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦; \! z# s8 B8 y
           0 U' w5 E% n# u
                if (numw[i] != 0)# E2 N2 s9 o" k  z
                    Console.WriteLine(numw[i]);
; P, \- X4 x$ Q  c$ Y: Z9 b1 l           
  f: ?4 G5 u# n! L0 C            Console.ReadLine();
* g' z7 |0 s5 o7 q- H7 m7 C        }
4 B8 A. z5 b# H    }
7 N' m7 z: n. _0 ?% z% m5 g7 G, G}
! Q5 [( q. g% R
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-1 10:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表