重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
這個問題是著名的Josephus排列,就是要用指針和鏈表才是正確的思路。不用指針就暫時放置這題。若有非指針解你完全可以采納他,若沒有用指針正確寫的,請結貼。給你個用指針并且還用鏈表的代碼參考以便你在未來學會指針后來閱讀。
創新互聯建站于2013年開始,先為茫崖等服務建站,茫崖等地企業,進行企業商務咨詢服務。為茫崖企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
方法一:(推薦)不受人數限制,因為采用的動態分配
#include stdio.h
#include malloc.h
/*********************************************************************
*以循環隊列的數據結構實現
*時間復雜度T(n)
*采用循環隊列數據結構,使得每次對數組的訪問次數減少到最少
**********************************************************************/
int main(void)
{
//定義并初始化各種變量
int i=0,//控制變量
num=0,//人數
die=0,//報數值
front,//隊頭位置
rear,//隊尾位置
temp=0;//中間變量
do
{
printf("\n請輸入人數(輸入小于0退出):");
scanf("%d",num);
printf("\n請輸入報數值:");
scanf("%d",die);
int *cycle=(int *)malloc((num+1)*sizeof(int));//多申請一個空間,在循環過程中方便處理
//依次編號,一號元素為0,暫時閑置
for(i=0;i=num;i++)
{
cycle[i]=i;
}
//置隊頭和隊尾的位置
front=1;
rear=num;
i=1;//報數器置1,開始報數
while(front!=rear)//當隊列中元素不止一個時,循環
{
//備份出隊數據
temp=(rear+1)%(num+1);//在位置rear后預留一個位置,以免有元素入隊
cycle[temp]=cycle[front];
front=(front+1)%(num+1);//隊頭元素出隊,隊頭位置加1
//如果出隊的人報數符合條件
if(i==die)
{
i=1;//報數重新置1,開始報數
printf("%d出隊\n",cycle[temp]);//顯示出隊的元素
}
//如果出隊的人報數不符合條件
else
{
i++;//報數值增1
//隊尾插入剛出隊的元素
rear=(rear+1)%(num+1);
cycle[rear]=cycle[temp];
}
}
printf("幸存者是%d\n",cycle[front]);
free(cycle);
}while(num!=0);
return 0;
}
方法二:(按你的要求)
#include stdio.h
/*********************************************************************
*以純粹的思維方法實現
*時間復雜度T(n)
*過程繁瑣,而且也不容易理解
*********************************************************************/
void main(void)
{
int result(int *p,int n,int m);
int i=0,m=0,n=0;
int num[50];
int *p;
for(;;)
{
printf("輸入人數和報數值:");
scanf("%d%d", n, m);
for(i = 0; i n; i++)
num[i] = i + 1;
p = num;
cout"The last one is NO."result(p,n,m)endl;
}
}
int result(int *p,int n,int m)
{
int i=0;
for(i=0;in;i++)
p[i]=i+1;
i=0; // i為每次循環時計數變量
int k=0; // k為按1,2,3...m報數時的計數變量
int die=0; // die為退出人數
while (dien-1) // 當退出人數比n-1少時(即未退出人數大于1時)執行循環體
{
if (p[i]!=0) k++; //如果編號為0,就不報數;如果編號不為0,報數加1
if (k==m) // 將退出的人的編號置為0
{
printf("%d退出\n",p[i]);
p[i]=0;
k=0;//重新開始報數
m++;//退出人數加1
}
i++;
if (i==n) i=0; // 報數到尾后,i恢復為0
}
while(*p==0) p++;
return *p;
}
#include stdio.h
int main()
{
int N,M,*a;
int i,j,position=1,total=0,chage;/*total出隊的人數*/
printf("Enter the N and M\n");
scanf("%d%d",N,M);
a=(int *)malloc(N*sizeof(int));
for (i=0;iN;i++)
a[i]=i+1;
while(1)
{
position+=M-1;
while (positionN-total)
position=position-N+total;
chage=a[position-1];
for (j=position;jN-total;j++)
a[j-1]=a[j];
a[N-total-1]=chage;
total++;
if (total==N)/*出隊人數等于N,程序結束*/
{
for (i=0;iN-1;i++)
printf("%d-",a[N-i-1]);
printf("%d\n",a[0]);
return 0;
}
}
}
#include
#include
#define n 200
void tian(int(*p)[n])
{
int i, j;
int mn=p[n-1][n-1];
for (i=0; imn; ++i)
{
for (j=0; jmn; ++j)
{
if ((i+j==mn-1))
{
p[i][j]=1;
continue;
}
if ((i+jmn-1))
{
p[i][j]=2;
continue;
}
if ((i+jmn-1))
{
p[i][j]=3;
continue;
}
}
}
}
int main()
{
int a[n][n];
int i, j;
int len;
scanf("%d", len);
a[n-1][n-1]=len;
tian(a);
for (i=0; ilen; ++i)
{
for (j=0; jlen; ++j)
printf("%2d", a[i][j]);
printf("\n");
}
return 0;
}