c語言報數
㈠ c語言:有n個人圍成一圈,按順序從1到n編號。從第一個人開始報數。
#include<stdio.h>
int main()
{
int i,n,N,out,a[1000];
out=i=n=0;
printf("輸入約瑟夫圈大小 100 ");
scanf("%d",&N);
for(i=0;i<N;i++)
{
a[i]=1;
}
i=0;
while(out!=N-1)
{
if(a[i]==1)n++;
if(n==3){a[i]=0;n=0;out++;}
i++;
if(i==N)i=0;
}
for(i=0;i<N;i++)
if(a[i]==1)printf("最後剩下的是第%d個人",i+1);break;
return 0;
}
(1)c語言報數擴展閱讀:
需要說明的是:
1、一個C語言源程序可以由一個或多個源文件組成。
2、每個源文件可由一個或多個函數組成。
3、一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。是整個程序的入口。
4、源程序中可以有預處理命令(包括include 命令,ifdef、ifndef命令、define命令),預處理命令通常應放在源文件或源程序的最前面。
5、每一個說明,每一個語句都必須以分號結尾。但預處理命令,函數頭和花括弧「}」之後不能加分號。結構體、聯合體、枚舉型的聲明的「}」後要加「 ;」。
6、標識符,關鍵字之間必須至少加一個空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。
網路-c語言
㈡ C語言 有n個人圍成一圈,按順序從1到n編號。從第一個人開始報數,報數3的人退出圈子
#include <stdio.h>
#define N 9999
int main()
{
int n,a[N],*p,i=0,out=0,count=0;
printf("Input n(n must be a natural number less than 10000):");
scanf("%d",&n);
if(n>=10000)
printf("n is out of range of valid values.");改為printf("%d is out of range of valid values.",n);
else
{
for(i=0;i<=n;i++) 改為a[i]=i;
a[i+1]=i; //這樣做a[0]是個不確定的值,執行完p=a;後*p
p=a; 的值也是不確定的,後面的if判斷條件不確定了
while(out!=n){ 這兒應該是out!=n-1吧
if(*p!=0) 這段可以改成這樣for(;;){ if(*p!=0){
count++; count++;p++;}結束if
if(count==3){ if(count==3){ out++; out++;
*p=0; *p=0; break;}結束if
} }結束for
count=0; //此處導致count永遠只能是0或1所以out的值不會變
把這兒的p++刪了 p++; while就成死循環了
if(*p==a[n-1]) 把這個if語句嵌套到if(*p!=0)里的p++後面這兒不要了
p=a;
}
printf("%d",*p);
}
return 0;
}
這樣改完後應該能把最後剩下的號碼打出,其實可以把出局的順序也打出來樓主想想啊,挺簡單的,而且好像有很短的代碼解決這個問題,多思考啊
㈢ C語言:n個編號為1~n的人圍坐一圈,從1號開始正向報數到m者退出,從下一人繼續;求出列序列,咋編程
代碼文本:
#include "stdio.h"
int main(int argc,char *argv[]){
int a[20],b[20],i,j,t,n,m;
printf("Enter n(int 0<n,m<21)... n m = ");
if(scanf("%d%d",&n,&m)==2 && n>0 && n<21 && m>0 && m<21){
for(i=0;i<n;a[i++]=i+1);//創建人員編號
i=-1,j=t=0;
printf(" The result is: ");
while(t<n)
if(a[++i%=n] && (++j%=m)==0){
printf("%d ",b[t++]=a[i]);//生成並輸出序列
a[i]=0;
}
putchar(' ');
}
else
puts("ERROR");
return 0;
}
供參考……