#include stdio.h
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計(jì),賀州網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:賀州等地區(qū)。賀州做網(wǎng)站價格咨詢: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為總?cè)藬?shù) M為報(bào)數(shù)最大值
#include stdio.h
void main()
{
int i = 0;
int n = 0;
int out = 0; //退出的人數(shù)
int num = 0; //報(bào)數(shù)
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;
}
}
}
此題可用數(shù)學(xué)方法求解。
設(shè)有n個人(編號0~(n-1)),從0開始報(bào)數(shù),報(bào)到(m-1)的退出,剩下的人繼續(xù)從0開始報(bào)數(shù)? (用數(shù)學(xué)方法解的時候需要注意應(yīng)當(dāng)從0開始編號,因?yàn)槿∮鄷〉?解。)
實(shí)質(zhì)是一個遞推,n個人中最終留下來的序號與n-1個人中留下來的人的序號有一個遞推關(guān)系式。
假設(shè)除去第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開始報(bào)0? (3)
0, 1, ? ? ..., n-k-1, n-k, n-k+1, ..., n-2 ? // 作編號轉(zhuǎn)換,此時隊(duì)列為n-1人 (4)
變
換后就完完全全成為了(n-1)個人報(bào)數(shù)的子問題,注意(1)式和(4)式,是同一個問題,不同的僅僅是人數(shù)。比較(4)和(3),不難看
出,0+k=k, 1+k=k+1, ... ,(3)式中'0'后面的數(shù)字,((n-3)+k)%n=k-3,((n-2)+k)%n=k-2,
對于(3)式中'0'前面的數(shù)字,由于比n小,也可看作(0+k)%n=k,? (1+k)%n=k+1,? 故可得出規(guī)律:
設(shè)(3)中某一數(shù)為x' , (4)中對應(yīng)的數(shù)為x,則有:x'=(x+k)%n.
設(shè)x為最終留下的人序號時,隊(duì)列只剩下1人時,顯然x=0; 此時可向前回溯至2人時x對應(yīng)的序號,3人時x對應(yīng)的序號……直至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);
}