C语言问题求大神指教

8.有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。
编程指导及提示:
以1至n为序给每个人编号,将编号存入数组中
按1,2,3报数,当计数变量为3时将退出的人的编号置为0
最后数组中编号不为0的即为最后留下

第1个回答  2019-04-17

C语言实现,输入n,按1、2、3循环报数,报3的出局,求剩下最后一个的编号,参考代码如下:

#include<stdio.h>
#include<stdlib.h>
int main()

int n,i,j=-1,cnt=0;
int *a;
scanf("%d",&n);
a=(int *)malloc(n*sizeof(int));
if(a==NULL)return 1;
for(i=0;i<n;i++)
a[i]=i+1;
printf("\n");
i=0;
while(1){
if(a[i]!=0){
if(j==i) break;
j=i;
cnt++;
if(cnt==3){
a[i]=0;
cnt=0;
}
}
++i;
if(i==n) i=0;
}
printf("%d",a[i]);
free(a);
return 0;
}

追答

本回答被网友采纳
第2个回答  2019-04-17
#include "stdio.h"
#include <stdlib.h>
int main(int argc,char *argv[]){
char *p;
int n,i,k,t;
printf("Please enter n(int 1000>n>0)...\nn=");
if(scanf("%d",&n)!=1 || n<1 || n>999){
printf("Input error, exit...\n");
return 0;
}
if((p=(char *)malloc(sizeof(char)*n))==NULL){
printf("Application memory failure, exit...\n");
return 0;
}
for(i=0;i<n;p[i++]=1);
for(k=t=i=0;t<n;++i%=n)
if(p[i] && (++k%=3)==0)
p[i]=0,t++;
free(p);
printf("The result is %d\n",i);
return 0;
}

运行样例:

第3个回答  2019-04-17

就是约瑟夫环问题呗~给题主一个数组实现的代码吧

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

/* 打印在列之人 */
void printJosephus (int *C, int n) {
int i;
for (i=0; i<n; i++)
if (C[i]==0)
printf ("%d\t", i+1);
putchar ('\n');
}

/* n个人围成圆圈C,依次报数,报到k的人出列 */
void josephus (int n, int k) {
int *C;
int num = 0, cnt = n;
int i = 0;

/* 申请一个包含n个元素的数组空间C,第i项表示第i+1个人,其值为0表示在列,为1表示已出列 */
/* calloc申请空间会自动将所有元素初始化为0,即n个人均在列 */
C = (int *) calloc (sizeof (int), n);

printf ("初始序列: \n");
printJosephus (C, n);
putchar ('\n');

printf("出列顺序: \n");
while (cnt > 1) { /* 仅剩下一人时结束 */
num += 1 - C[i]; /* 1-L[i]表示遇到在列者报数(+1),否则跳过(+0) */
if (num == k) { /* 报到k之人 */
printf ("%d\t", i+1); /* 打印此人位置 */
C[i] = 1; /* 标识此人已出列 */
cnt--; /* 在列人数减1 */
num = 0; /* 重新报数 */ 
}
i = (i+1) % n; /* 除以n取余,使i在0~n-1之间循环,以循环遍历数组 */
}
putchar ('\n');
putchar ('\n');

printf ("最后幸存者的位置: \n");
printJosephus (C, n);

free (C);
}

int main (void) {
josephus (8, 3); /* result: 7 */

getch (); /* 屏幕暂留 */ 
return 0 ;
}

备注一下,以上代码按顺序编号,如果题主要求自定义编号的话,可自行补充。

第4个回答  2019-04-17
2011年荣获

c语言高手指教。。。
四、C:由于case中没有break,因此在每一次运行时要从第一个应该执行的case开始到后面所有的case语句;五、C:p[0]=4;而执行for时是从p[1]开始的,所以6+8=14;六、似乎是程序有问题;七、显然是程序有问题,写错了,可能是k=a*c吧;

C语言编程问题,求大神指教 编写程序,输入两个正整数m和n,求∑(i*i+...
s += m*m+1.0\/m;

C语言,数组输入遇到问题求大神指教:哪里错了,如何改正,为什么会出现...
scanf的格式加'\\n',含义特殊,不是输入一个回车,而是输入完一个数字后,必须等待一个非空格、制表符、回车的输入,程序才会继续。所以你那样写,第一次循环输入2回车,不会进入下一次循环,而是等待再次输入,然后你输入3的时候2被存储在元素1中,进入下一个循环,已经有3了还要等待输入,于是你输入...

C语言问题,不是java哦,我想弄一个数字金字塔,下面的步骤不知道我哪里错...
1.语法错误 for(j=1;j=5-i;j++)中j=5-1应该改成j<=5-i 2.逻辑错误 如果你要的是以下效果,那你的想法是不行的 1 222 33333 4444444 555555555 算了,直接给你我改后的吧 include<stdio.h> void main(){ int i,j,k; \/\/ loop循环子 int n = 6; \/\/ 金字塔高度 for (i = 1...

C语言有关方程的问题,高手指教
ax+by=c (*)其中a,b,c都是整数,所求的解(x,y)也是整数.由于方程(*)如果有解,则解不是唯一确定的,所以称为不定方程.二元一次不定方程是一类重要的方程,应用很广.关于方程(*)的可解性,有下面的两个重要的结论:(1)设gcd(a,b)表示整数a,b的最大公约数.方程(*)有解的充分必要条件...

C语言求完数,不能理解这个代码,求大神指教,最好能详细一点。万分感谢...
include<stdio.h>#include<math.h> \/\/使用sqrt函数要包含此头文件int main() { int n, i, j, k, sum, temp; int a[10]; scanf("%d",&n); for(i = 1; i <= n; ++i) { \/\/在1~范围内逐个检查sum = 1; \/\/初始化,1肯定是一个因子for(j = 2; j <= sqrt(i...

一段C语言代码不知道错哪儿了,请高手指教
编译错误,一般是语法有问题,程序在编译是就产生错误不能编译成目标文件,比如包名或内部类名写错误等等。运行错误,就是程序通过编译,却在运行时出错,一般是逻辑上的问题,比如数组越界,空指针等等。比较常见的运行时错误是在做除法运算时所产生的“除数为零”错误。如下列 VB 代码:Dim a As ...

c语言 鞍点问题,求大神指教我哪里写错了~~~
你的程序问题在于 i 这个变量嵌套的for循环覆盖了上层的for循环中的 i值,把嵌套for循环改为变量k就好了(添加一个变量k)for(k=0;k<4;k++) \/*每一行的最大点和该点所在列的数比较,看它是否是鞍点。*\/ { if(array[k][column]>max) printf("\\n");else printf("%d\\n",max);} ...

C语言求大神指教,帮帮忙~~小弟不胜感激~~~
{ long ID;char name[10];int score[3];}STD;void aver(int ave[],STD stu[]){ int i;for(i=0;i<N;i++){ ave[i]=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])\/3;} } void put(STD stu[],int aver[]){ int i;for(i=0;i<N;i++){ printf("%10ld:...

c语言菜鸟求大神指教 想自己定义函数求10位数的平均值来着。。。_百 ...
%d",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j);print_average(a,b,c,d,e,f,g,h,i,j);} } int main(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j){ average=(a+b+c+d+e+f+g+h+i+j)\/10;printf("该门课的平均分为%d\\n",average);} ...

相似回答