本帖最后由 红龙果 于 2015-11-19 19:42 编辑
题:耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。
实现思路:1、定义一个长度为15的整形数组,数组元素值为1。
2、定义一个计数用的变量,count;剩下人的个数len;
3、循环遍历数组,当碰到数组元素值为1时,执行count++,然后判断count的值,count=3时,将数组元素的值置为0,count置为0;
当len=1时,退出循环。剩下的一个人就是叛徒了。
代码:
#include <stdio.h>
#include<stdlib.h>
int main(int argc, const char * argv[]) {
printf("请输入人数:\n");
int num;
scanf("%d",&num);//接收数组元素个数
int *pt=(int *)malloc(sizeof(int)*num);//动态申请一块大小为(int类型数据所占字节数)*(数组元素个数)的内存空间,用来存储数组元素
//c99之后的编译器支持以下的动态数组定义方式:int arry[num];
//而int *pt=(int *)malloc(sizeof(int)*num);可以在程序运行时分配内存,并可在运行时选择数组大小;在c99之前的编译器中都支持
//申请分配内存失败,退出程序
if (pt==NULL) {
printf("memory allocation failed!\n");
exit(EXIT_FAILURE);
}
//对数组进行初始化,遍历元素,赋值为1
for (int i=0; i<num; i++) {
pt[i]=1;
}
int getLocation(int *arr,int len);//函数原型
int value= getLocation(pt,num);//调用函数,返回叛徒所在位置
printf("%d\n",value);//打印输出
free(pt);//释放内存
return 0;
}
int getLocation(int *arr,int len)
{
int location=0;//定义叛徒所在位置的变量
int count=0;计数器,用来数1,2,3,1,2,3
int personNum=len;剩余门徒个数
//圈子中门徒数等于1时退出循环
while (personNum>1) {
//遍历数组
for (int i=0; i<len; i++) {
//arr[i]==1代表未退出圈子的门徒;
if (arr[i]==1) {
count++;//计数器加1
//碰到数到3的门徒,则将元素值置为0;0代表退出圈子的门徒,1代表未退出圈子的门徒
if (count==3) {
arr[i]=0;
personNum--;//圈子中的门徒总数减一
count=0;//重新计数
}
}
}
}
//遍历获取值为1的元素的下标,也就是叛徒的位置
for (int i=0; i<len; i++) {
if (arr[i]) {
location=i;
}
}
return location+1;//返回叛徒的位置
}
程序运行结果:15个门徒的情况。第五个人时叛徒。
请输入人数: 15 5 Program ended with exit code: 0
3个门徒的情况。第2个人时叛徒 请输入人数: 3 2
Program ended with exit code: 0
|