#include stdio.h
成都创新互联公司是一家专注于成都网站建设、成都做网站与策划设计,贺州网站建设哪家好?成都创新互联公司做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:贺州等地区。贺州做网站价格咨询:18982081108
int main(void)
{
int n, m, i, s=0;
printf ("N M = "); scanf("%d%d", n, m);
for (i=2; i=n; i++) s=(s+m)%i;
printf ("The winner is %d\n", s+1);
}
说明:只要输入N=10,M=8即可满足你的要求 还可以有其他变化 其中n为总人数 M为报数最大值
#include stdio.h
void main()
{
int i = 0;
int n = 0;
int out = 0; //退出的人数
int num = 0; //报数
int a[1024] = {0}; //0表示退出圈子
printf("Input n:");
scanf("%d", n);
for (i = 0; i n; i++)
{
a[i] = 1;
}
i = 0;
while (out != n-1)
{
if (a[i] == 1)
{
num++;
}
if (num == 3)
{
a[i] = 0;
num = 0;
out++;
}
i++;
if (i == n)
{
i = 0;
}
}
for (i = 0; i n; i++)
{
if (a[i] == 1)
{
printf("最后留下的人是%d号.\n", i+1);
break;
}
}
}
此题可用数学方法求解。
设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)
实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。
假设除去第k个人,则
0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1 // 原始序列 (1)
0, 1, 2, 3, ..., k-2, , k, ..., n-1 // 除去第k人,即除去序号为k-1的人 (2)
k, k+1, ..., n-1, 0, 1, ..., k-2// 以序号k为起始,从k开始报0 (3)
0, 1, ..., n-k-1, n-k, n-k+1, ..., n-2 // 作编号转换,此时队列为n-1人 (4)
变
换后就完完全全成为了(n-1)个人报数的子问题,注意(1)式和(4)式,是同一个问题,不同的仅仅是人数。比较(4)和(3),不难看
出,0+k=k, 1+k=k+1, ... ,(3)式中'0'后面的数字,((n-3)+k)%n=k-3,((n-2)+k)%n=k-2,
对于(3)式中'0'前面的数字,由于比n小,也可看作(0+k)%n=k, (1+k)%n=k+1, 故可得出规律:
设(3)中某一数为x' , (4)中对应的数为x,则有:x'=(x+k)%n.
设x为最终留下的人序号时,队列只剩下1人时,显然x=0; 此时可向前回溯至2人时x对应的序号,3人时x对应的序号……直至n人时x的序号,即为所求。
#include stdio.h
int main()
{
int n,m,s=0;
scanf("%d%d",n,m);
for (int i=2;i=n;++i)
{s=(s+m)%i;
printf("%d\n",s+1);}
return 0;
}
#define N 10
struct s
{
int val;
struct s * before;
struct s * next;
};
struct s *head=0,*temp;
int count=N;
main()
{
int i,j;
struct s *p;
printf("\n\n\n");
for(i=0;iN;i++)
{
p=(struct s*)malloc(sizeof(struct s));
p-val=i+1;
if(head==0)
{
p-before=0;
p-next=0;
head=p;
temp=p;
}
else
{
p-before=temp;
temp-next=p;
temp=p;
if(i==N-1)
{
temp-next=head;
head-before=temp;
}
}
}
temp=head;
i=1;
while(count1)
{
if(i==8)
{
printf("%d,",temp-val);
count--;
(temp-before)-next=temp-next;
(temp-next)-before=temp-before;
temp=temp-next;
i=1;
}
else
{
i++;
temp=temp-next;
}
}
printf("the last is %d",temp-val);
}