紧急 求一份C语言程序题目:20个人坐在一圈,报到3或3的倍数的人出席,问最后剩下的人是谁?c语言编程

20个人坐在一圈,报到3或3的倍数的人出席,问最后剩下的人是谁?

#include <stdio.h>

int main()
{
int i, k, n, t;
t = 20;
n = 3;
for(i = 1; i <= t; ++i)
k = (k + n) % i;
printf("最后剩下的是第 %d 个人\n", k+1);
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-08
用C++写的
用数组解决
#include <iostream.h>
void display(int[],int n,int m);
void main()
{
int n,m;
int a[20];
cout<<"请输入人数:";
cin>>n;
cout<<"请输入间隔数:";
cin>>m;
for(int i=1;i<=n;i++)
{
a[i-1]=i;
}
display(a,n,m);
}
void display(int a[],int n,int m)// 约瑟夫环算法
{
int i,k,c1,c2,c3;
k=-1;
for(int p=1;p<=n;p++)
{
i=0;
c1=k+n+m;
k=c1%n;
while(i!=m)// 判断数组元素是否输出
{
i++;
c2=(k+i+n-m)%n;
if (a[c2]==0)
{
k++;i--;
}
}
c3=k%n;
cout<<a[c3]<<" ";
a[c3]=0;//标志已输出数组元素
}
cout<<endl;
}

用链表解决
#include <iostream.h>
struct Node
{
int data;
struct Node *next;
};
Node *createlist(int);
void displist(Node *,int,int);
void main()
{
Node *head;
int n,i,m;
cout<<"请输入人数:";
cin>>n;
cout<<"请输入间隔数:";
cin>>m;
head=createlist(n);
cout<<"结果:";
displist(head,n,m);
}
Node *createlist(int n)//建立循环链表
{
Node *head,*r,*s;
for(int i=0;i<n;i++)
{
s=(Node*)new(Node);
s->data=i+1;
s->next=NULL;
if (i==0)
{
head=s; r=s;
}
else
{
r->next=s; r=s;
if (i==n-1)
{
r->next=head;
}
}
}
return head;
}
void displist(Node *head,int n,int m )//约瑟夫环算法
{
Node *p;
for(int k=0;k<n;k++)
{

if(m>1)
{
p=head->next;
for (int i=1;i<m-1;i++)
{
head=head->next;
p=p->next;
}
cout<<p->data<<" ";
head->next=p->next;
head=head->next;
delete p;
}
else if(m=1)
{
p=head;
cout<<p->data<<" ";
head=p->next;
delete p;
}
}
cout<<endl;
}

紧急 求一份C语言程序题目:20个人坐在一圈,报到3或3的倍数的人出席,问...
printf("最后剩下的是第 %d 个人\\n", k+1);return 0;}

C语言。从1到100进行报数,报到3或3的倍数时就跳过。求代码。
include<stdio.h> int main(){ int i;for(i=1;i<=100;i++){ if(i%3!=0)printf("%d ",i);} return 0;}

C语言有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报 数...
if(*p==0){\/\/如果健在 if(out_n==(N-1))break;\/\/如果仅剩一人 call_n++;\/\/报数 call_n%=3;\/\/最大为3,到了3就从0开始 if(call_n==0){*p=1;out_n++;}\/\/为0(即3)出局 } p++;if(p==a+N)p=a;\/\/循环转向下一人 } printf("最后剩余者的编号是:%d\\n",p+1-a);}...

有N只猴子选大王,选举的办法是:排成一排,从头到尾报数,报到3的倍数(
题目是输入两个正整数 n 和 m( (1<m<n<=50)),有 n 个人围成一圈,按顺序从 1 到 n 编号。从第一个人开始报数,报数 m 的人退出圈子,下一个人从 1 开始重新报数,报数 m 的人退出圈子。如此循环,直到留下最后一个人。请按退出顺序输出退出圈子的人的编号,以及最后一个人的编号。...

...每一轮3的倍数的人剔除,最后剩两个人,问这两人的编号
int data;Josephus *next;};void main(){ void DeleLq(Josephus *L,int m);Josephus *L=new Josephus;L->next=L;L->data=1;Josephus *p;int n;cout<<"输入表长:";cin>>n; \/\/设定线性列表长度 for(int i=n;i>1;--i) \/\/初始化线性列表 { p=new Josephus;p->data=i;p-...

c语言:围圈报数123,报三的退出,只剩一人。我用自己思路做了,有个难点...
你的OutRing函数的C语言程序,我帮你改完了,改动的地方比较多,但结构大致没变,你仔细看看吧(主要问题有判断两个数相等要用双等号,变量或指针for循环用后没赋初始值)include<stdio.h>void OutRing(int * pA, int n){ int t = 1, i,j,k, summary = n, temp = 1, *ptemp0, *ptemp1,*p...

有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数3的人退 ...
设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。假设除去第k个人,则 0, 1, 2, 3...

C语言中我如果看到一个题目,我该如何着手去编写程序
本题思路:1.在草稿纸上简单的分析发现,这个报数过程可以用数组来模拟。2.建一个21位的数组,数组索引代表每个人的编号,数组值代表1代表在圈中0代表离开。3.在只剩一人之前不断的循环报数,故考虑用while循环。4.while没循环一次就相当于报一个数(num++),如果此时报的数能被5整除,就把数组...

c语言:读入N,求出1..N的范围内所有2或3或5的倍数一共有多少个
int main(int argc,char *argv[]){ int N,s,i;printf("Enter N(int N>1)...\\nN=");if(scanf("%d",&N)!=1 || N<2){ printf("Input error, exit...\\n");return 0;} for(s=0,i=2;i<=N;i++)s+= i%2==0 || i%3==0 || i%5==0;printf("The result is %d...

电脑系统后面md5什么意思电脑系统的MD5值和SHA1值是什么意思
不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但md2的设计与md4和md5完全不同,那是因为md2是为8位机器做过设计优化的,而md4和md5却是面向32位的电脑。这三个算法的描述和c语言源代码在internet rfcs 1321中有详细的描述(h++p:\/...

相似回答
大家正在搜