分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
10个人围成一圈,编号依次从1到10.从编号为1的人开始从1到3报数,凡报数是3的人退出圈子.编写程序输出依次出列的人的编号.(用选择,循环语句以及数组知识编写)
解析:
新手当然要照顾了 所以一个代码一个代码的给你加注释。。
看明白了最好自己在做一边
这题有很多做法 给你一个最好理解的例子吧 但是这个代码的效率。。。。。
代码如下:
#include <stdioh>/头文件/
#define M 10 /宏定义 可直接改变圈的大小/
#define N 3 /可定义 从1数到 几 退出这个圈子/
void main()/主函数/
{
int a[M];/定义数组/
int i;/用做循环等/
int x = 1; /数到几/
int y = 0;/最近M次循环里有多少个人已经出去这个圈/
int k = 1;/while的开关变量/
for(i=0; i<M; i++)/给数组赋值/
{
a[i] = i+1;
}
while(k)
{
for(i=0; i<M; i++)/M个为一组按照下标过滤/
{
if(a[i] == 0)/判断这个a[i]位置上的人是否已经出圈/
{
y++;/如果出圈变量加一/
continue;/退出本次循环/
}
if(x == N)/a[i]上的人没有出圈 而且正好数到N/
{
printf("%d ",a[i]);/显示这个人的编号/
a[i] = 0;/用0代替 代表已经出圈/
x = 1;/数 数重新从1 开始/
}
else/a[i]上的人没有出圈 但还没有数到N/
{
x++;/继续数下一个数/
}
}
if(y == M)/如果M个为一组全都已经出圈 代表圈里已经没有人了/
{
k = 0;/退出while循环程序结束/
}
else/圈里还有人/
{
y = 0;/把y置0待下次for循环时重新计数/
}
}
printf("\n");/可有可无/
getch();/可有可无/
}
结果为
3 6 9 2 7 1 8 5 10 4
你可以更改程序中的M N的数字来改变要求。
多做做题有好处 ,祝你快点进步。!
由于百度对对齐的处理非常差 所以你可以到这里看代码
bababian/photozoomslpictureid=B16AE5B1739602D1F2A716DB4EA83D52DT&size=6&viewID=DB4A5B6DABA0DD07C8135UR
如果看不清 请右键 另存后在看 。
百度 老岩 gabmyd@126
经典的约瑟夫环问题
设n个人围成一圈,标号为0n-1,从第一个人开始依次从1到k循环报数,当报到k的
时候此人出圈。设J(n,
k,
i)表示第i个出圈的人的标号。
定理一:
J(n,
k,
1)
=
(k-1)
MOD
n,
(n>=1,
k>=1)
…………
(1)
证明:由定义直接得证。
定理二:
J(n+1,
k,
i+1)
=
(k
+
J(n,
k,
i))
MOD
(n+1),
(n>=1,
k>=1,
1<=i<=n)
………
…
(2)
证明:
设g
=
J(n,
k,
i),因此如果有n个人,从0开始报号,第i个出圈的标号为g。现在考
虑J(n+1,
k,
i+1),因为J(n+1,
k,
1)
=
(k-1)
MOD
(n+1),即第一步的时候删除数
字(k-1)
MOD
(n+1),第二步的时候从数字k开始数起。因而问题变为了找到剩下的n
个数字中从k开始数起被删除的第i个数字(注意这时(k-1)
MOD
(n+1)已经被删除了)
,而这恰好就是(g+k)
MOD
(n+1),(2)成立。
根据(2),很容易求得n个数里面第i个出圈的数。
就根据这个定理递推计算吧!
比较完整的
#include<Windowsh>
#include<stringh>
#include<iostream>
using namespace std;
struct PERSON
{
int flag;
int num;
PERSON pNext;
};
int g_iCount=0;
void ArrayEatMouse(int a[],int count,int num)
{
int iLoop=0;
int ExitNum=0;
int iCount=0;
while(ExitNum<count-1)
{
if(0==a[iLoop])
{
Sleep(100);
iCount++;
if(iCount==num)
{
a[iLoop]=1;
cout<<"第 "<<iLoop+1<<" 出圈!"<<endl;
iCount=0;
ExitNum++;
}
}
iLoop++;
if(iLoop==count)
iLoop=0;
}
}
PERSON ListEatMouse(PERSON pHead,int count,int num)
{
PERSON pCur=pHead;
PERSON pPre;
int ExitNum=0;
int iCount=0;
if(NULL==pCur)
{
cout<<"List Is NULL"<<endl;
return NULL;
}
bool bIsOut=false;
while(ExitNum<count-1)
{
Sleep(100);
iCount++;
if(iCount==num)
{
bIsOut=true;
pPre->pNext=pCur->pNext;
cout<<pCur->num<<"出圈!"<<endl;
delete pCur;
pCur = pPre->pNext;
iCount=0;
ExitNum++;
if(NULL==pCur)
{
pCur=pHead;
continue;
}
}
if(!bIsOut)
{
pPre = pCur;
pCur=pCur->pNext;
if(NULL==pCur)
pCur=pHead;
}
else
{
bIsOut=false;
continue;
}
}
//返回最后的胜出的节点指针!
return pPre;
}
PERSON CreatList()
{
PERSON pHead=NULL;
PERSON pCur;
PERSON pPre;
pCur=new PERSON;
cin>>pCur->num;
pCur->flag=0;
while(pCur->num!=0)
{
if(NULL==pHead)
{
pHead=pCur;
pCur->pNext=NULL;
}
else
{
pPre->pNext=pCur;
}
g_iCount++;
pPre=pCur;
pCur=new PERSON;
cin>>pCur->num;
pCur->flag=0;
}
delete pCur;
pCur = NULL;
pPre->pNext=NULL;
return pHead;
}
int main()
{
PERSON pHead=NULL;
PERSON pNewHead;
cout<<"参加游戏的人员:"<<endl;
pHead = CreatList();
PERSON pTemp=pHead;
int num;
cout<<"计数最大值!"<<endl;
cin>>num;
cout<<"开始游戏!"<<endl;
pNewHead=ListEatMouse(pHead,g_iCount,num);
if(pNewHead!=NULL)
{
cout<<"第 "<<pNewHead->num<<"个人胜出!"<<endl;
}
//释放胜出节点!
delete pNewHead;
pNewHead = NULL;
return 0;
}
你问的是约瑟夫问题 。
我之前用Java语言实现过,用eclipse 软件直接可以实现
package joseph;
public class joseph {
public static void main(String[] args) {
Creatlist creatlist=new Creatlist();
creatlistget_n(17);
creatlistlinklist();
creatlistshowlink();
creatlistget_k(2);
creatlistget_m(3);
creatlistplay();
}
}
class node
{
int num;
node nextnode=null;
public node(int num)
{
thisnum=num;
}
}
class Creatlist
{
int n=0;
public void get_n(int n)
{
thisn=n;
}
node firstnode=null,temp=null;
int i=0;
public void linklist()
{
for(i=1;i<=n;i++)
{
if(i==1)
{
node node1=new node(i);
firstnode=node1;
temp=node1;
}else if(i!=n)
{
node node2=new node(i);
tempnextnode=node2;
temp=node2;
}else
{
node node3=new node(i);
tempnextnode=node3;
temp=node3;
tempnextnode=firstnode;
}
}
}
public void showlink()
{
node temp=firstnode;
do
{
Systemoutprintln(tempnum);
temp=tempnextnode;
}while(temp!=firstnode);
}
int k;
public void get_k(int k)
{
thisk=k;
}
int m;
public void get_m(int m)
{
thism=m;
Systemoutprintln("每"+thism+"个删除一个节点");
}
public void play()
{ //关于i 全局变量or局部变量
int i,j;
node temp1=null;
node temp=firstnode;
temp1=firstnode;
for(i=1;i<=k-1;i++)
{
temp1=tempnextnode;
temp=tempnextnode;
}
Systemoutprintln("从第"+tempnum+"个节点开始");
//Systemoutprintln("从第"+temp1num+"个节点开始");
while(n!=1)
{
for(j=1;j<m;j++)
{
temp=tempnextnode;
}
for(j=1;j<m-1;j++)
{
temp1=temp1nextnode;
}
Systemoutprintln("delete num is"+tempnum);
temp1nextnode=tempnextnode;
temp=tempnextnode;
temp1=temp1nextnode;
n--;
}
Systemoutprintln("最后一根独苗是"+tempnum);
}
}
/我对你的题目理解是这样,你看有没有错:
首先,13个人围成一圈,1-2-3报数,报到3的就退出圈外,下轮报数时他就不能报了。还有报到最后剩一个人的时候就停止,输出剩下那个人的号数。程序如下:可以通过改Num的值来改变人数/
#include<stdioh>
#define Num 13
struct man //每个同学拥有学号和报的数两个信息
{ int no;
int shu;
}man[Num];
void main()
{
int i,j,k,N=Num,lun=0,c=0;
for(j=0;j<Num;j++)
{
man[j]shu=0;
man[j]no=j+1;
}
while((Num-N)<(Num-2))
{
lun++;
N=0;
for(i=0;i<Num;i++)
{
if(man[i]shu!=3)
{
c++;
man[i]shu=c;
N++;
}
if(c==3)
c=0;
}
printf("第%d轮:\n",lun);
for(k=0;k<Num;k++) //每报一轮 输出一下整体报数情况
printf("%d %d\n",man[k]no,man[k]shu);
}
printf("最后胜出的是:\n");
for(k=0;k<Num;k++)
{
if(man[k]shu!=3)
printf("%d号\n",man[k]no);
}
}
以上就是关于C语言新手求助!!!急!!!全部的内容,包括:C语言新手求助!!!急!!!、有N个人围成一环形圈,第一个人从1开始报数,报道M的人出列,直到最后一个同学,请写出算法。、约瑟夫问题:n个人围成一圈,从第1个人开始数数,数到3的人出圈,输出出圈人的顺序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)