演算法思想
從第一個人數到第五個人,第五個人淘汰,然后從第六個人開始從1計數,數到5淘汰,一直繼續下去。
代碼實作
include <stdio.h>
#define length 37//定義長度
int F_Winner(int *p,int m,int num);//宣告F_Winner函式
void OP_Winner(int *p);//宣告OP_Winne函式
void main()
{
int array[length];
int i = 0;
int m = 0;
//陣列array賦初值
for(i;i < length; i++)
{
array[i] = i + 1;
}
for(i = 0;i < length-1;i++)
{
m = F_Winner(array, m, 5);
array[m] = 0;
}
OP_Winner(array);
}
//找出贏家
int F_Winner(int *p,int m,int num)
{
int count = 0;
while(1)
{
if(p[m] != 0)
{
count++;
if(num == count)
break;
}
m++;
if(m >= length)
{//溢位,把0賦值給m
m = 0;
}
}
return m;
}
//輸出贏家的編號
void OP_Winner(int *p)
{
int i;
for(i = 0;i < length;i++)
{
if(p[i] != 0)
{
printf("第%d人是贏家。\n",p[i]);
}
}
}
運行結果
uj5u.com熱心網友回復:
//假設有n個人團團圍做,從第1個人開始數數,數到第m個人時候,第m個人出列,
//然后繼續從1開始數數,數到第m個人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0該座位未出圈,1該座位已出圈
void main() {
while (1) {
printf("Input n m(1000>=n>=m>=1):");
fflush(stdout);
rewind(stdin);
if (2==scanf("%d%d",&n,&m)) {
if (1000>=n && n>=m && m>=1) break;
}
}
t=0;//已出圈總人數
i=1;//座位編號
k=1;//當前要數的數
while (1) {
if (0==f[i]) {
if (m==k) {
t++;
f[i]=1;
printf("%3d ",i);
if (0==t%10) printf("\n");
if (t>=n) break;
}
k++;if (k>m) k=1;
}
i++;if (i>n) i=1;
}
cprintf("Press any key ...");
getch();
}
uj5u.com熱心網友回復:
頭檔案:#include<stdio.h>定義函式:int fflush(FILE * stream);
函式說明:fflush()會強迫將緩沖區內的資料寫回引數stream指定的檔案中,如果引數stream為NULL,fflush()會將所有打開的檔案資料更新。
回傳值:成功回傳0,失敗回傳EOF,錯誤代碼存于errno中。
fflush()也可用于標準輸入(stdin)和標準輸出(stdout),用來清空標準輸入輸出緩沖區。
stdin是standard input的縮寫,即標準輸入,一般是指鍵盤;標準輸入緩沖區即是用來暫存從鍵盤輸入的內容的緩沖區。stdout是standard output 的縮寫,即標準輸出,一般是指顯示幕;標準輸出緩沖區即是用來暫存將要顯示的內容的緩沖區。
清空標準輸出緩沖區,
重繪輸出緩沖區,即將緩沖區的東西輸出到螢屏上
如果圓括號里是已寫打開的檔案的指標,則將輸出緩沖區的內容寫入該指標指向的檔案,否則清除輸出緩沖區。
這里的stdout是系統定義的標準輸出檔案指標,默認情況下指螢屏,那就是把緩沖區的內容寫到螢屏上。
可是從代碼中看不出緩沖區會有什么內容,所以它實際上沒有起什么作用
uj5u.com熱心網友回復:
rewind(stdin)清除標準輸入的按鍵緩沖區uj5u.com熱心網友回復:
fflush()也可用于標準輸入(stdin)和標準輸出(stdout),用來清空標準輸入輸出緩沖區
這句fflush(stdin);在windows下的某些編譯器可能有效,不等于其他編譯器也一定有效;受限于某些編譯器~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/270030.html
標籤:C語言
下一篇:漢羅塔問C語言遞回
