約瑟夫問題c語言數組
⑴ c語言解決約瑟夫死亡游戲問題,用calloc函數和數組,要求簡潔明了。
bool a[101]={1}; //a[i]表示第i人還活著
int n,m,i=0,s=0,t=0;
cin>>n>>m; //人數n,報數m
do
{
i=i%n+1; //數組模擬環狀
if(a[i])t++; //第i個人還活著則報數
if(t==m) //當前報的數是m
{
s++; //死亡人數+1
cout<<i<<'\t'; //輸出被殺人編號
a[i]=0; //此處人已死,設置為0
t=0; //計數器清零
}
}while(s!=n); //直到所有人都被殺死為止
⑵ C語言中用數組解約瑟夫問題
#include<stdio.h>
#include<stdlib.h>
void main()
{
int y(int n,int m);
int p,q,r;
printf("請輸入參選人的個數p和開始的位置q: ");
scanf("%d%d",&p,&q);
r=y(p,q);
printf("最後那個人的初始位置是:%d ",r);
}
int y(int n,int m)
{
int i,j=0,s=0,l;
int *a=(int *)malloc(sizeof(int));
int *b=(int *)malloc(sizeof(int));
for(i=0;i<n;i++)
{
a[i]=i+1;
}
a[n]=-1;
for(i=0;j!=n;i++)
{
if(a[i]==-1)
i=0;
if(a[i]!=0 && a[i]!=-1)
s++;
if(s==m)
{
b[j]=a[i];
a[i]=0;
j++;
s=0;
}
}
for(i=0;i<n;i++)
{
printf("%5d",b[i]);
}
printf(" ");
l=b[n-1];
return l;
}
(2)約瑟夫問題c語言數組擴展閱讀:
大體思路如下:
①、read(a)
②、b:=1,c:=1{b為某一組的元素個數,c為累計所加到的數}
③、while c<a do (b:=b*2,c:=b+c){超過目標時停止加數}
⑥、c:=c-b{退到前一組}
⑦、x:=a-c{算出目標為所在組的第幾個元素}
⑧、ans:=x*2-1{求出該元素}
⑨、write(ans)
⑶ 約瑟夫問題 c語言數組
用數組,結構體都可以來完成,呵呵
int a[300]={1}; 賦值一個都是1的數組,用多少,取多少用
int i=0,n,m,k,t;
scanf("%d %d",&n,&m);
t=m;
for(i=0,k=0;t!=1;i++) //死循環 //用t計數,當t成為1時,退出循環
{
if(i==n) //完成首尾的銜接
i=0;
if(a[i]!=0) //數一個
k++;
if(k==m) //如果數到m個,則把這個賦值為0.標記這個出局
{
a[i]=0;
k=0; //如果判斷為k%m==0,則這一句可以不要
t--; //記錄還有幾個沒有出局的
}
}
鏈表,判斷條件就是next指針指向自己,呵呵
原理差不多,自己寫吧
⑷ C語言編程問題:約瑟夫問題求解
用一個循環鏈表就可以完成了!
#include<stdio.h>
struct node{
int data;
struct node *next;
}node,*list,*p,*r;
void JOSEPHU(int n,int k,int m)
{
int i,j;
list=NULL;
for(i=1;i<=n;i++)
{
p=(struct node*)malloc(sizeof(node));
p->data=i;
if(list==NULL)
list=p;
else
r->next=p;
r=p;
}
p->next=list; /*建立一個循環鏈表*/
p=list;
for(i=1;i<=n+1;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n"); /*列印鏈表,並檢查循環鏈表是不輸入正確*/
p=list;
i=1;
while(p&&i<k)
{ r=p;
p=p->next;
++i;
}
for(i=1;i<n;i++)
{
for(j=1;j<m;j++)
{ r=p;
p=p->next;
}
printf("The out=%d\n",p->data);
r->next=p->next;
}
}
void main()
{
int x, y, z;
printf("input the lenth n\n");/*n,k,m分別代表總的人數,第一個報數的人,間隔的人數*/
scanf("%d",&x);
printf("input the start k\n");
scanf("%d",&y);
printf("input the m\n");
scanf("%d",&z);
JOSEPHU(x,y,z);
}
⑸ 數據結構中的約瑟夫環問題用C語言怎麼編寫出來啊
題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出
圈子,問最後留下的是原來第幾號的那位。
1.
程序分析:這是一個比較經典的演算法--約瑟夫環問題.
2.個人分析:
演算法比較經典,對於這樣的問題本應該使用鏈表的形式會比較容易.約瑟夫環演算法
則體現了使用數組來完成鏈表該完成的功能,雖然形式上完全不相同,但卻求出了
相同的結果.有異曲同工之妙.總之我個人認為是數組中非常經典的演算法了.希望本
人寫的代碼不會叫大家啐罵!
3.程序源代碼:
#include
<stdio.h>
#define
N
50
#define
S
3
void
main()
{
int
a[N];
int
i,k;
int
sum=N;
k=0;
for(i=0;i<N;i++)
a[i]=i+1;
for(i=0;i<N;i++)
printf("%-4d",a[i]);
printf("\n");
for(i=0;;i++)
{
if(sum==1)
break;
if(a[i%N]!=0)
{
k++;
}
if(k==S)
{
k=0;
//printf("%4d",a[i%N]);
a[i%N]=0;
sum--;
}
}
for(i=0;i<N;i++)
if(a[i]!=0)
printf("\n最後一個數為:%d\n",a[i]);
}
兩年前念書的時候寫的,獻丑了!
⑹ 約瑟夫問題c語言
#include<stdio.h>
#define size 100 /* 輸入人數的上限 */
void main()
{
int person[size];
int i, j; /* 循環修正變數 */
int arrayLen; /* 數組長度 */
int start, overNum; /* 開始位置各跨過位置 */
int deleNum; /* 出列人所在數組中的下標 */
int name, total; /* 輸入時,人的信息以及人的總數 */
printf( "請輸入圓桌上人的總數: " );
scanf( "%d", &arrayLen ); printf( "\n" );
if( ( arrayLen > size ) || ( arrayLen < 0 ) )
{
printf( "超出范圍,請重新輸入: " );
scanf( "%d", &arrayLen ); printf( "\n" );
};
printf( "請輸入各個人的信息(整數): \n" );
for( i = 0; i < arrayLen; i++ )
{
scanf( "%d", &name );
person[i] = name;
}
printf( "你輸入的數據的順序為: \n" );
for( i = 0; i < arrayLen - 1; i++ )
printf( " %d ==>", person[i] );
printf( "%d \n", person[arrayLen - 1] );
printf( "你打算從第幾個人開始? 請輸入開始號: " );
scanf( "%d", &start );
printf( "\n" );
start = start - 1;
printf( "請輸入相鄰兩出列人之間的間隔: " );
scanf( "%d", &overNum );
printf( "\n" );
total = arrayLen;
printf( "程序運行後,出列人的順序為:\n\n" );
for( i = 0; i < total; i++ ) /* 要列印total個人的情況,故做total次 */
{
if ( arrayLen == 1 )
printf( "%d", person[0] ); /* 如果是數組只剩一個元素,直接出列 */
else
{
deleNum = ( start + overNum - 1 ) % arrayLen; /* 此取模保證循環 */
printf( "%d ==> ", person[deleNum] );
for ( j = deleNum; j < arrayLen; j++ ) /* 將出列元素後面的各元素前移 */
person[j] = person[j+1];
start = deleNum;
arrayLen = arrayLen - 1; /* 移動完畢後,數組長度減1 */
}
}
printf( "\n\n" );
}
從一本數據結構書上看到的用向量實現此問題:
void Josephus (Vector <int> &P, int n, int s, int m)
{
//將人員編號存入向量P;
int k = 1;
for(int i = 0; i<n, i++)
{P.Insert(k,i); k++;}
int s1 = s;
for(int j = n; j>=1; j--)
{
s1=(s1+m-1)%j;
if(s1== 0) s1 = j;
int w = P.Getnode(s1 - 1);
P.Remvoe(s1 - 1);
P.Insert(w,n-1);
}
}
以前學C語言的時侯寫的,希望對你有用。
⑺ 求解用C語言數組實現約瑟夫環問題
如果只需要結果的話可以把數到3的人置零,然後輸出不是零的數就OK了
或者
可以先數學遞推一下,比模擬效率高多了~~!!
具體的看我空間這直接給你代碼吧
#include <stdio.h>
int main()
{
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);
}
⑻ C語言,編了一個程序解決約瑟夫環問題(數組模擬1代表有人,0代表走了)下面的代碼對嗎
#include<stdio.h>
#defineN10
intmain()
{
inta[N];
inti,people=N,n=0;
for(i=0;i<N;i++)
a[i]=1;
i=0;
while(people>0)
{
if(a[i]==1)//非0的才統計
n++;
if(n==3)
{
a[i]=0;
people--;
printf("第%d個人離開 ",i+1);
n=0;
}
i++;
if(i==N)
i=0;
}
return0;
}