据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头
智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说:
从我开始报数(围成一圈),第5个人可以吃到馒头(并退下)
按此方法,所有和尚都吃到了馒头,唯独鲁智深没有吃上
请问他在那个位置?
能否借鉴筛选法求出剩下的最后一个人的位置?
#include<stdio.h>
int main()
{
int all[100]={0};//创建100人的数组,全部赋值0
int arr[99]={0};//记录出局者
int count = 0;//记录报数
int c=0;//数组中非1的元素个数
int i=0; int j=0; int k=0;
while(c != 1)//有馒头者不只有一个人则循环
{
c = 0;//每次循环重置c的值
/*
if(count == 5)
{
count = 0;
}
感觉有些多余就注释掉了
*/
for(i=0;i<100;i++)
{
if(all[i] == 0)
{
count++;
}
if(count%5==0 && all[i] == 0)
{
all[i] = 1;//数到5的人出局赋值为1
}
}
for(j=0;j<100;j++)
{
if(all[j] == 0)
{
c++;
}
}
}
for(i=0;i<100;i++)
{
if(all[i] == 0)
{
printf("鲁智深=%d\n",i+1);
}
}
return 0;
}
筛选法
又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。