當前位置:首頁 » 編程語言 » c語言數數出列
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言數數出列

發布時間: 2022-12-15 05:36:23

c語言編程題,13個人圍成圈編號1~13數到3的出列,然後從第四個開始為1繼續數到3的出列,最後剩下的是幾號

結果是13號!
代碼:
#include<stdio.h>

#define N 13

int main()
{
int flag[N+1] = {0}; //標志已出列的人,第0位不用
int i,j,out = 0;
i=1; //i為人的標號,初始值為1
j=0; //j為數的數字,當j=3時,對應的人出列
while(out < N) //out為已出列的人數,當out=N-1時,循環退出
{
if(flag[i] == 0) j++;
if(j == 3)
{
flag[i] = 1; //標志此人出列
j = 0; //重新開始數數字
out ++; //出列人數加1
}
i ++;
if(i == N) i = 0; //重新從1號人開始數
}

i = 1;
while(flag[i] == 1) i++;

printf("最後剩下的小孩為%d號!\n",i);

return 0;
}

② c語言 給出一個數怎樣輸出該數的全排列

C語言版:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
inta[10],book[10],n,k[10],l;
voiddfs(intstep)
{
inti=0;
if(step==l+1)
{
if(a[1]!=0)
{
for(i=1;i<=l;i++)
{
printf("%d",a[i]);
}
printf(" ");
}
return;
}
for(i=0;i<l;i++)
{
if(book[k[i]]==0)
{
a[step]=k[i];
book[k[i]]=1;
dfs(step+1);
book[k[i]]=0;
}
}
}
intmain(void)
{
memset(k,0,sizeof(k));
memset(book,0,sizeof(book));
intn;
scanf("%d",&n);
charbuf[15]="";
sprintf(buf,"%d",n);
l=strlen(buf);
inti=0;
for(i=0;i<l;i++)
k[i]=buf[i]-'0';
dfs(1);
system("pause");//如果通不過編譯就試著刪除這句話
return0;
}

C++版:

#include<cstdio>
#include<cstdlib>
#include<cstring>
inta[10],book[10],n,k[10],l;
voiddfs(intstep)
{
if(step==l+1)
{
if(a[1]!=0)
{
for(inti=1;i<=l;i++)
{
printf("%d",a[i]);
}
printf(" ");
}
return;
}
for(inti=0;i<l;i++)
{
if(book[k[i]]==0)
{
a[step]=k[i];
book[k[i]]=1;
dfs(step+1);
book[k[i]]=0;
}
}
}
intmain(void)
{
memset(k,0,sizeof(k));
memset(book,0,sizeof(book));
intn;
scanf("%d",&n);
charbuf[15]="";
sprintf(buf,"%d",n);
l=strlen(buf);
for(inti=0;buf[i]!='';i++)
k[i]=buf[i]-'0';
dfs(1);
return0;
}

③ C語言 報數出列

#include<stdio.h>
#include<math.h>
void main()
{
int sint[10000]={0};
int dint[10000]={0};
int s=0,d=0;
int i=1,j=0,n=0,m=0;
long l;
int ln=0;
while (1)
{
printf("請輸入循環隊列的n和m(n<10000,m<10000)(格式:n m):");
scanf("%d %d",&ln,&m);
fflush(stdin);
if ( ( ln>0 && ln <10000 ) && ( m>0 && m <10000 ) )
break;
else
printf("\nERROR:錯誤,輸入有誤,重新輸入!\n");
}
n=ln;
for (i=0;i<n;i++)
{
sint[i]=i+1;
}
l=0;
while (n>=0)
{
l++;
if (l%m==0)
{
dint[d]=sint[s];
for(j=s;j<n;j++)sint[j]=sint[j+1];
sint[j+1]=0;
n--;
d++;
}else
s++;
if(s==n) s=0;
}

for (i=0;i<ln;i++)printf("%d ",dint[i]);
printf("\n");
}
示例:
請輸入循環隊列的n和m(n<10000,m<10000)(格式:n m):20 2
2 4 6 8 10 12 14 16 18 20 3 7 11 15 19 5 13 1 17 9

④ C語言,報數出列

intn,m,loop;
intcurrentNum;
intoutNum;
int*state;

printf("輸入人數:");
scanf("%d",&n);
printf("輸入要報的數:");
scanf("%d",&m);

//構造一個狀態表,0表示還在圈內,1表示已經出圈
state=(int*)malloc(sizeof(int)*n);
for(loop=0;loop<n;loop++)
{
state[loop]=0;
}

currentNum=n;
while(1)
{
//圈裡只有一個人
if(currentNum==1)
{
break;
}

outNum=m%currentNum;//計算是第幾個人出圈
if(outNum==0)
{
outNum=currentNum;
}

//找到出圈的人
for(loop=0;loop<n;loop++)
{
if(state[loop]==0)
{
outNum--;
}
if(outNum==0)
{
break;
}
}
state[loop]=1;//表示已經出圈
currentNum--; //全人數減少
}

for(loop=0;loop<n;loop++)
{
if(state[loop]==0)//找到最後的那一個人
{
break;
}
}

printf("最後出圈的人編號是:%d ",loop+1);

free(state);

⑤ 簡單c語言程序產生隨機數列

提供一個不同的思路,1到20的話范圍不大,可以用列舉法把這區間的數都列出來,存在數組里,然後隨機打亂,可以從任意位置i(0

i
<
16)開始取5個數,取出的數就是隨機的了,而且保證不重復。
#include
<stdio.h>
#include
<stdlib.h>
#include
<time.h>
//
初始化有n個元素的數組a,從begin_num開始遞增賦值
void
init(int
*
a,
int
n,
int
begin_num)
{
int
i;
for(i
=
0;
i
!=
n;
++i)
a[i]
=
begin_num++;
}
//
交換
inline
void
swap(int
*
a,
int
*
b)
{
int
c;
c
=
*a;
*a
=
*b;
*b
=
c;
}
//
隨機打亂
void
shuffle(int
*
a,
int
n)
{
int
i;
for(i
=
0;
i
!=
n;
++i)
swap(&a[i],
&a[rand()
%
n]);
}
//
輸出
void
output(int
*
a,
int
n)
{
while(n
!=
-1)
printf("%2d
",
a[n--]);
putchar('\n');
}
int
main()
{
int
a[20];
int
i;
srand((unsigned)time(0));
init(a,
20,
1);
//
測試10組隨機數據
for(i
=
0;
i
<
10;
++i)
{
shuffle(a,
20);
output(a,
5);
}
return
0;
}

⑥ c語言數組怎樣單獨取出某一列的數據

b[i]是每一行的首地址,b[i]+j 是第i行第j列的地址,*(b[i]+j)才是b[i][j],你要取出每一列單獨組成數組,可以這么做:
int row; //行
int col ; //列
for(col =0; col < CN; col++) //CN為總的列數
for(row = 0; row< RN; row++) //RN為總行數
{
ave_c[col] = b[row][col]; //這里列下標不變,改變行下標,就能取出每一列的所有數據,ave_c[col]用來存第col列,col從0開始
}

⑦ M個人圍成一圈報數,報到N的人出列,輸出出列順序!用C語言實現!

此題可用數學方法求解。


設有n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數 (用數學方法解的時候需要注意應當從0開始編號,因為取余會取到0解。)


實質是一個遞推,n個人中最終留下來的序號與n-1個人中留下來的人的序號有一個遞推關系式。


假設除去第k個人,則


0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1 // 原始序列(1)


0, 1, 2, 3, ..., k-2, , k, ..., n-1 // 除去第k人,即除去序號為k-1的人 (2)


k, k+1, ..., n-1, 0, 1, ..., k-2// 以序號k為起始,從k開始報0 (3)


0, 1, ..., n-k-1, n-k, n-k+1, ..., n-2 // 作編號轉換,此時隊列為n-1人 (4)



換後就完完全全成為了(n-1)個人報數的子問題,注意(1)式和(4)式,是同一個問題,不同的僅僅是人數。比較(4)和(3),不難看
出,0+k=k, 1+k=k+1, ... ,(3)式中'0'後面的數字,((n-3)+k)%n=k-3,((n-2)+k)%n=k-2,
對於(3)式中'0'前面的數字,由於比n小,也可看作(0+k)%n=k, (1+k)%n=k+1, 故可得出規律:


設(3)中某一數為x' , (4)中對應的數為x,則有:x'=(x+k)%n.


設x為最終留下的人序號時,隊列只剩下1人時,顯然x=0; 此時可向前回溯至2人時x對應的序號,3人時x對應的序號……直至n人時x的序號,即為所求。


#include<stdio.h>
intmain()
{
intn,m,s=0;
scanf("%d%d",&n,&m);
for(inti=2;i<=n;++i)
{s=(s+m)%i;
printf("%d ",s+1);}
return0;
}

⑧ c語言 數組倒序輸出一列數

修改了下:
#include<stdio.h>
void main()
{
int a[5],i,t;
for(i=0;i<5;i++)
scanf("%d",&a[i]);
for(i=0;i<5;i++)
{
t=a[i];
a[i]=a[4-i];
a[4-i]=t;
}
for( i=4;i>=0;i--)
printf("%d\t",a[i]);

}
//這樣果斷麻煩
這樣就清水了:
#include<stdio.h>
main()
{int a[5],i;
for(i=0;i<5;i++)
scanf("%d",&a[i]);
for(i=4;i>=0;i--)
printf("%d",a[i]);
}
輸入用空格分開