❶ 報數(c語言)
方法一:
#include<stdio.h>
void main()
{int a[100][100],n,m,i,j;    /*a[100][100]只是隨機設置的一個數組,需要時可設得更大或更小*/
K:scanf("%d:%d",&n,&m);   /*注意輸入格式,其中的":",表示兩者的關系為"報數->取數"的關系*/ 
if(n>0&&m>0)
{for(i=1;i<=n;i++)
a[1][i]=i;
for(i=1;i<=n;i++)
{for(j=m%(n+1-i)+1;j<=(n+1-i);j++)   /*將取余後右邊第一項,作為下一次數數的最前一項,依次遞增*/
a[i+1][j-m%(n+1-i)]=a[i][j];
for(j=1;j<=m%(n+1-i);j++)             /*將取余後左邊第一項,作為下一次數數的最後一項,
a[i+1][(n+1-i)-m%(n+1-i)+j]=a[i][j];   依次遞減;並將取到的數,依次放在下一次數數的外層*/
printf("f(%d:%d)(%d)=%d\n",n,m,i,a[i+1][(n+1-i)]);}} /*輸出每一次報數時,取到的數*/
else printf("No effect!\n");
goto K;           /*goto語句使程序可重新輸入其他的情況,如"13:3"表示13個人,每報3次數,退出一個人*/
getch();} 
方法二:
#include<stdio.h>
void main()
{int a[100],i,j,n,m;
K:scanf("%d:%d",&n,&m);
for(i=1;i<=n;i++)
a[i]=i;
for(j=0,i=1;i<=n;i=i%n,i++) /*i=i%n用來實現當i從1到達n,將重新回到1*/
{if(a[i]!=0) {j++; if(j%m==0) printf("f(%d)=%d\n",j/m,a[i]),a[i]=0;}
if(j/m==n) break;} /*反復計數,將數過的數標記為0,下次數數時不再數它*/
goto K;
getch();}
❷ c語言 報數
#include <stdio.h> 
#include <conio.h> 
int fun(int n)
{ 
int i = 0, p, tmp; 
while( ++i <= n ) 
{ 
p = i * 3; 
while (p > n) 
p = p - n + (p - n - 1)/(3 - 1); 
tmp=p;
} 
return tmp; 
} 
void main() 
{int m; 
scanf("%d",&m); 
printf("n=%d\n",fun(m)); 
}
❸ c語言:圍圈報數123,報三的退出,只剩一人。我用自己思路做了,有個難點,無法解決,望前輩解答。
你的OutRing函數的C語言程序,我幫你改完了,改動的地方比較多,但結構大致沒變,你仔細看看吧(主要問題有判斷兩個數相等要用雙等號,變數或指針for循環用後沒賦初始值)
#include<stdio.h>
voidOutRing(int*pA,intn)
{
intt=1,i,j,k,summary=n,temp=1,*ptemp0,*ptemp1,*ptemp2,*ptemp3;
ptemp0=pA;
ptemp1=pA;
ptemp2=pA;
ptemp3=pA;
for(i=0;i<n;i++)
{
*ptemp0=1;ptemp0++;/*將數組所有元素賦值為1*/
}
i=0;
while(summary>1)
{
summary=0;
if(*ptemp2==1)
{
if(temp%3==0){*ptemp2=0;}temp++;
}
if(i==n-1){
i=0;
ptemp2=pA;
}else{
i++;
ptemp2++;
}
ptemp1=pA;
for(k=0;k<n;k++)
{
summary+=*ptemp1;
ptemp1++;
}
}if(summary==1)
{
for(i=0;i<n;i++)
{
if(*ptemp3==1){printf("結果是%d",(i+1));return;}
ptemp3++;
}
}
}
intmain()
{
inta[100],n=100;
OutRing(a,n);
return0;
}

❹ C語言編程,報數問題!
#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;i<N;i++) 
a[i]=i+1; 
while(1) 
{ 
position+=M-1; 
while (position>N-total) 
position=position-N+total; 
chage=a[position-1]; 
for (j=position;j<N-total;j++) 
a[j-1]=a[j]; 
a[N-total-1]=chage; 
total++; 
if (total==N)/*出隊人數等於N,程序結束*/ 
{ 
for (i=0;i<N-1;i++) 
printf("%d->",a[N-i-1]); 
printf("%d\n",a[0]); 
return 0; 
} 
} 
}
❺ C語言編程報數問題
有n個人a1,a2…,an圍成一圈報數,每報到m的人就出隊#include<stdio.h> void main() { int i,k,m,n,*p,num[50];
❻ 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語言:有n個人圍成一圈,按順序編號。從第1個人開始報數,數到m時該人退出,下
M
❽ C語言,報數問題
你這代碼想法有問題:消去3的倍數的數,在第一次,還可以,第二次,則不知道該如何消除了,因為,數的排列變化了(有了間隔),而且,你也沒有考慮,數到最大值後,程序該怎麼辦?
❾ 一道C語言結構題,求大神解答: n個人依次報數,每報到m從圈中退出,依次輸出退出人的號碼(用數組)
main()
{inta[100],i,j,k;
for(i=0;i<100;i++)
a[i]=1;
for(i=k=0;k<100;k++)
{j=0;
while(j<10)
{i=(i+1)%100;
if(a[i])
j++;
}
a[i]=0;
}
printf("%d ",i);
getch();
}
❿ C語言報數問題,報到3的人退出圈子,我快瘋了
下面兩種方法是我編寫的  供參考
 
用指針  數組編寫
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int n,i=0,j,k,a,q=0,(*p)[2];
 printf("請輸入學生人數:");
 scanf("%d",&n);
 p=(int (*)[2])calloc(n+1,sizeof(int (*)[2]));
 for(i=0;i<n;i++)
 {
  *(*(p+i)+0)=1;
  *(*(p+i)+1)=i+1;
 }
 *(*(p+n)+0)=0;
 *(*(p+n)+1)=n+1;
 for (;n!=1;)
 {
  for(j=i+2,q=0;j<n-q;j+=2,q++)
  {
   for(k=j;k<n;k++)
   {
    *(*(p+k)+0)=*(*(p+k+1)+0);
    *(*(p+k)+1)=*(*(p+k+1)+1);
   } 
  }
  a=n+3-i;
  if(a%3==1)i=-1;
  else if(a%3==2)i=-2;
  else
   i=0;
  n=n-q;
 }
 printf("最後剩下的是%d號同學\n\n",*(*(p+0)+1));
 return 0;
}
用鏈表編寫
#include <stdio.h>
#include <stdlib.h>
struct stu
{
 int f;
 int b;
 struct stu *next;
};
int main()
{
 struct stu *p,*p1,*head=NULL;
 int n,i=0,j,k=0,t=0;
 printf("請輸入學生人數:");
 scanf("%d",&n);
 p=(struct stu *)malloc(sizeof(struct stu)); 
 for(i=0;i<n;i++)
 {
  p1=(struct stu *)malloc(sizeof(struct stu));
  p1->f=i+1;
  p1->b=1;
  if(i==0)
   head=p1;
  else
   p->next=p1;
  p=p1;
 }
 p->next=NULL;
 for(j=0;n-t>1;j++)
 { 
  for(p=head;p!=NULL;p=p->next)
  {
   
   if((p->b)!=0)
    k++;
   if(k==3)
    p->b=0;
   if(k==3)
   {
    k=0;
    t++;
   }
  }
  
 }for(p=head;p!=NULL;p=p->next)
  if(p->b==1)
   printf("最後留下的學生編號是:%d\n\n",p->f);
 return 0;
}
