當前位置:首頁 » 編程語言 » c語言報數問題

c語言報數問題

發布時間: 2022-09-20 03:15:41

c語言報數問題

設有n個人圍坐一圈並按順時針方向從1到n編號,從第s個人開始進行1到m的報數,報數到第個m人,此人出圈,再從他的下一個人重新開始1到m的報數,如此進行下去直到所有的人都出圈為止。現要求按出圈次序,每10人一組,給出這n個人的順序表。請考生編制函數Josegh()實現此功能並調用函數WriteDat()把結果p輸出到文件OUT.DAT中。
設n=100,c=1,m=10.
(1)將1到n個人的序號存入一維數組p中;
(2)若第i個人報數後出圈,則將p[i]置於數組的倒數第i個位置上,而原來第i+1個至倒數第i個元素依次向前移動一個位置;
(3)重復第(2)步直至圈中只剩下p[1]為止。
部分源程序已給出。
請勿改動主函數main()和輸出數據函數writeDat()的內容。 #include <stdio.h>
#define N 100
#define S 1
#define M 10int p[100],n,s,m;
void WriteDat(void);void Josegh(void)
{}void main()
{
m=M;
n=N;
s=S;
Josegh();
WriteDat();
}void WriteDat(void)
{
int i;
FILE *fp;

fp=fopen("out.dat" ," w" );
for(i=N-1;i>=0;i--){
printf(" %4d" ,p[i]);
fprintf(fp," %4d" ,p[i]);
if(i % 10==0){
printf("\n" );
fprintf(fp, "\n" );
}
}
fclose(fp);
}
/* 註:題中第一個for()循環是先對數組p賦初值。在第二個for()中用i來控制沒出圈的
總人數,s1=(s1+m-1)%i的作用是找出報數後出圈人的下標,其中對i求余的作用是使報
數按圈進行(即報到尾後又從頭報),該演算法在很多題目中都用到。由於求余的作用當
報數正好到最後一個時s1為0,故而要進行if(s1==0)的判斷。內嵌的for()循環是將出圈
以後的人依次往前移。*/
void Josegh(void)
{
int i,j,s1,w;
s1=s;
for(i=1;i<=n;i++)
p[i-1]=i;
for(i=n;i>=2;i--)
{s1=(s1+m-1)%i;<br>if(s1==0)<br>s1=i;<br>w=p[s1-1];<br>for(j=s1;j<i;j++)<br>p[j-1]=p[j];<br>p[i-1]=w;<br>}
} 這的問題和這個一樣,看看吧,應該能解決了

❷ C語言圍圈報數問題

n=10
m=3
1 2 3 4 5 6 7 8 9 10
1 2 3 1 2 3
你告訴我第二個人怎麼算出7的,這題目是來搞笑的么!

❸ C語言,報數問題

這個問題是著名的Josephus排列,就是要用指針和鏈表才是正確的思路。不用指針就暫時放置這題。若有非指針解你完全可以採納他,若沒有用指針正確寫的,請結貼。給你個用指針並且還用鏈表的代碼參考以便你在未來學會指針後來閱讀。
http://blog.csdn.net/z84616995z/article/details/37969175

❹ C語言編程報數問題

自己寫的,完整的程序,並附有測試的數據。
分別用鏈表和順序表實現了。樓主可以好好看看。

http://..com/question/411820901.html?oldq=1
代碼我就不重復貼了。好運!

❺ c語言中報數問題

程序沒具體看
10%99=10不是0因為C語言%是求余 / 才是相除取整(舍余舍小數)

❻ c語言 報數問題

方法一:(推薦)不受人數限制,因為採用的動態分配
#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;i<n;i++)
p[i]=i+1;
i=0; // i為每次循環時計數變數
int k=0; // k為按1,2,3...m報數時的計數變數
int die=0; // die為退出人數
while (die<n-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;
}

❼ C語言,報數問題

#include <stdio.h>
int main()
{
int a[1000], i, n, k, m=0, left;//left用來記錄剩餘的非0數據的個數
int *p = a + 1;
scanf("%d%d", &n, &k);
left = n;//初始化剩餘非0數據個數
for(i=1; i<=n; i++)
a[i] = i;
for(p; p<=a+n; p++) {
if(*p != 0) {
m++;
}
if((m % k == 0) && (m != 0)) {//m != 0這個條件很重要,用來避免重復
*p = 0;
m = 0;//每數到k將m值置0
left--;//剩餘非0數據減1
if (left < k)//剩餘個數小於k,則退出循環
break;
}
if(p == a + n)//數到最後一個的時候,從頭開始數
p = a ;//這里p的值應該改為a;因為進入下一輪循環的時候,在for(p; p<=a+n; p++)中是先執行p++的,執行p<=a+n是p的值為p+1了
}
p = a + 1;
for(p; p<=a+n; p++)
printf("%d ",*p);
return 0;
}

❽ c語言圍圈報數問題

#include<stdio.h>
#defineM10
#defineN3
voidmain(void)
{
inta[M],b[M];
inti,m,k;

for(i=0;i<M;i++)
a[i]=i+1;

m=0;
i=0;
while(m<10){
k=0;
while(1){
if(a[i]>0)
{
k++;
if(k>=3)
break;
}
i=(i+1)%M;
}
b[m]=a[i];
a[i]=0;
++m;
i=(i+1)%M;
}

for(k=0;k<M;++k)
{
printf("%d",b[k]);
}
}

❾ C語言 報數問題

#include<stdio.h>
int main(void)
{
int a[9999],n,i,count,num,*p;
p=&a[0];
count=1;
n=i=num=0;
printf("Input n(n must be a natural number less than 10000):");
scanf("%d",&n);
if(n<=10000)
{
for(i=0;i<n;i++)
a[i]=i+1;
while(num<n-1)
{

count++;
p++; //這里就有越界的可能(p>&a[n-1]),如果這里越界了,那下
面的循環就不會執行了,那麼p就一直++,直到num==n-1
if(p>&a[n-1]) //所以這里就要判斷一下,或者開始時就把a的所有
元素全部初始化為0,就不用這個判斷了
p=&a[0];
while(*p==0)
{
p++;
if(p>&a[n-1])
p=&a[0];
}

if(count%3==0)
{
*p=0;
num++;
}

}
while(*p==0)
{
p++;
if(p>&a[n-1])
p=&a[0];
}
printf("Last No. is:%d",*p);
}
else
printf("%d is out of range of valid values.",n);
return 0;
}

❿ C語言報數游戲,從某一個數開始,另一個人報數比第一個人加一或二,報到24著輸

咨詢記錄 · 回答於2021-11-13

熱點內容
微博緩存的圖片能清理嗎 發布:2025-01-11 11:01:49 瀏覽:306
文字加密器 發布:2025-01-11 11:01:08 瀏覽:453
vc60非靜態編譯 發布:2025-01-11 10:51:32 瀏覽:614
電腦上怎麼解壓縮文件 發布:2025-01-11 10:51:31 瀏覽:782
槍戰王者如何用賬號密碼登錄 發布:2025-01-11 10:30:56 瀏覽:936
mysql在linux下安裝 發布:2025-01-11 10:30:49 瀏覽:844
資料庫copy 發布:2025-01-11 10:26:06 瀏覽:534
unity清理緩存 發布:2025-01-11 10:25:23 瀏覽:467
優酷視頻雙擊上傳 發布:2025-01-11 10:24:41 瀏覽:964
存儲臍帶胎兒幹細胞 發布:2025-01-11 10:18:36 瀏覽:332