當前位置:編程學習大全網 - 編程語言 - c語言報數問題

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>}

} 這的問題和這個壹樣,看看吧,應該能解決了

  • 上一篇:我現在十六歲該學什麽技術
  • 下一篇:漫畫家 插畫家都用什麽軟件繪畫?
  • copyright 2024編程學習大全網