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
;
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)
{
q
= p
->next
;
p
->next
= q
->next
;
cout
<<endl
<<" 第"<<q
->data
<<"个猴子退出,还剩"<<m
-1<<"个猴子"<<endl
;
delete q
;
i
=0;
m
--;
}
if(n
==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为基数的 翻过,输出:这时正面向上的牌有哪些?
数据结构设计
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;
}
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
;
}
测试结果