问怎样排法,才能使每次投入大海的都是异教徒。
提示:①30个人顺序编号,自增量k报数,k%9==0时,此人投入大海。投入大海标志为置数组元素值为0(或-1)。投入大海的人不再报数。
程序输出要求:程序运行后,显示原始顺序,每次投入大海的人的信息及剩下人的顺序,(使用一维数组).
据提示内容可分析出,相当于这30个人站成一列,然后在数出第九个人的时候.整个队列开始重新报数,并且在投入大海的那个人之前的人依次前往队伍的最后。但是由于要求使用一维数组完成,所以需要将计数变量达到30时,将计数变量置为0,避免数组越界。
1 为基督徒,0 为异教徒。
提前将所有会报9的位置的人都安排为异教徒:
for(i=1,count=0,t=0;;i++)
{
if(a[i]=='1')
t++; //所有人围成一个圈,当数到的人是基督徒时,计数器t++
if(t%9==0)
{
a[i]='0'; //将投入大海的位置标记为0,也就是异教徒;
count++; //如果数的人是9的倍数,投入大海的人数count++;
}
if(i==30) //当i==30的时候,需要将i重置为零,否则数组便会越界;
i=0;
if(count==15) //投入15个人了,跳出循环;
break;
}
将安排好位置的队列拿出来逢9的倍数便将异教徒投入大海。
for(i = 1,t = 0,count = 0;;i++)
{
if(a[i]!=' ')
t++; //t相当于数的人;
if(t%9 == 0)
{
a[i]=' '; //第九个位置的人要投入大海,因投入大海的人不再报数,所以将投入大海的人的位置空出来.
count++; //投入大海的人数++
printf("第%d次投入大海:\n",count);
for(j = 1;j <= 30;j++)
printf("%c",a[j]);
printf("\n");
printf("\n");
}
if(i == 30)
i=0;
if(count == 15)
break;
}
完整代码:
#include<stdio.h>
int main()
{
int i,t,j;
char a[30];
for(i = 1;i <= 30;i++)
a[i]='1'; //首先令所有人都是基督徒
int count;
for(i = 1,count = 0,t = 0;;i++)
{
if(a[i] == '1')
t++; //所有人围成一个圈,当数到的人是基督徒时,计数器t++
if(t%9 == 0)
{
a[i] = '0'; //将投入大海的人的位置置数组元素值为0
count++; //如果数的人是9的倍数,投入大海的人数count++;
}
if(i == 30) //当i==30的时候,需要将i重置为零
i=0;
if(count == 15) //投入15个人了,跳出循环
break;
}
printf("\n");
for(i = 1,t = 0,count = 0;;i++)
{
if(a[i]!=' ')
t++; //t相当于数的人;
if(t%9 == 0)
{
a[i]=' '; //第九个位置的人要投入大海,因投入大海的人不再报数,所以将投入大海的人的位置空出来.
count++; //投入大海的人数++
printf("第%d次投入大海:\n",count);
for(j = 1;j <= 30;j++)
printf("%c",a[j]);
printf("\n");
printf("\n");
}
if(i == 30)
i=0;
if(count == 15)
break;
}
return 0;
}
对我的博客或其他方面有任何见解或问题的话都可以私信我
或者联系本人QQ:3128909688
微信:DreamHerome
欢迎致电