猴子选大王和纸牌游戏

    技术2026-02-28  4

    1.猴子选大王

    一堆猴子都有编号,编号是1,2,3 …m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

    要求

    输入数据:输入m,n m,n 为整数,n<m 输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号 ,建立一个函数来实现此功能

    数据结构设计

    设计一个循环的单链表,使其可以一直循环数数,每数到N个即删除节点,最后留下了的即为大王

    typedef struct LNode { int data; struct LNode *next; }LinkNode;

    流程设计

    输入猴子个数m和间隔数n判断m,n是否合法,非法则重新输入,合法进入下一步建立一个带头节点的循环单链表,代表m个猴子围坐一圈遍历循环单链表,数到n的猴子退出,删除节点。重新计数当循环单链表中只剩下一只猴子是,即为大王。若输入的n为1,猴子依次退出,最后一个为大王

    主要代码

    //设计一个循环单链表模拟猴子围坐在一圈 //数到的猴子退出,删除节点 //只剩下一个猴子时,即为大王 int SelectKing() { int m,n,i;//i为当前数到的数 while(1) { system("cls"); cout<<endl<<"请输入猴子个数m(m为正整数):"; cin>>m; cout<<endl<<"输入间隔数n(n为正整数且m>n): "; cin>>n; if(m>0 && n>0 && m>n) break; else //异常处理 cout<<endl<<"输入错误,请重新输入"<<endl<<endl; system("pause"); } LinkNode *s,*r,*p,*L; LNode *q; L = new(LinkNode); r = L; for(int i=1;i<=m;i++) { s = new(LinkNode); s->data = i; r->next = s; r = s; } r->next = L->next; //创建循环单链表 p = L->next; i = 1; while(1) { if(i == n-1)//数到n的猴子退出 { q = p->next; p->next = q->next; cout<<endl<<" 第"<<q->data<<"个猴子退出,还剩"<<m-1<<"个猴子"<<endl; delete q; //猴子退出,删除节点 i=0; m--; } if(n==1) //间隔数为1时,猴子依次退出,最后一个即为大王 { cout<<endl<<" 第"<<p->data<<"个猴子退出,还剩"<<m-1<<"个猴子"<<endl; delete q; //猴子退出,删除节点 i=0; m--; } i++; p = p->next; if(m==1)//链表中只剩下一个猴子即为大王 { cout<<endl<<" 选出第"<<p->data<<"个猴子为大王"<<endl<<endl; break; //选出大王,退出循环 } } }

    测试结果

    2.纸牌游戏

    编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次, 直到最后一张牌;…再依次5的倍数的牌翻一次,6的,7的 直到 以52为基数的 翻过,输出:这时正面向上的牌有哪些?

    数据结构设计

    //设计一个长度为53的线性表,丢弃0节点 //1表示正面向上,0表示正面向下 typedef struct { int data[53]; int lenght; }Sqlist; //把牌翻一次 int swap(int i) { if(i == 0) return 1; else return 0; }

    流程设计

    创建一个长度为53的线性表,丢弃0节点,其他的节点赋值为1,代表正面向上编写一个翻转纸牌的函数,若纸牌为1则返回0。若纸牌为0则返回1编写两个循环嵌套,从第二张牌开始便利,以2的倍数翻转纸牌,直到最后一张牌。从3开始遍历,以3的倍数翻转纸牌,直到一52开始,翻转到最后一张输出正面向上的纸牌

    程序代码

    void game() { int i,j; Sqlist *L; L = new(Sqlist); L->lenght = 53; for(i=1;i<L->lenght;i++) { L->data[i] = 1; //所有的牌赋为1表示正面向上 } for(i=2;i<L->lenght;i++) { for(j=i;j<L->lenght;j++) { if(j%i == 0) { L->data[j] = swap(L->data[j]); //把牌翻一次 } } } j = 0; cout<<endl<<" 正面向上的牌有:"; for(i=0;i<L->lenght;i++)//输出正面向上的牌 { if(L->data[i] == 1) { cout<<i<<" "; j ++; } } cout<<endl<<endl<<" 一共有 "<<j<<" 张正面向上的牌"<<endl<<endl; }

    测试结果

    Processed: 0.011, SQL: 9