当前位置:首页 » 编程语言 » 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]);
}
输入用空格分开