分鱼问题
/*
有五个人分一堆鱼,平均分成五份,多出一条,将其扔掉,然后一个人拿走一份,直到最后一个人 ,求这堆鱼的总数
*/
#include<iostream>
using namespace std;
void fish_total()
{
int num[5];
for(num[0]=1;;num[0]++) /*改进 1,num[0]必须是五的倍数 , 所以 num[0]+=5 可以更节省时间 初始值6*(5/4)^4=15*/
{
if(num[0]%5!=1) /*枚举可以写成一个for 循环 */
continue ;
num[1]=(num[0]-1)/5*4; /* for(i=1;i<=4;i++) */
if(num[1]%5!=1) /* num[i]=(num[i-1]-1)/5*4 ; */
continue ;
num[2]=(num[1]-1)/5*4; /* if(num[i]%5!=1) */
if(num[2]%5!=1)
continue ; /*break ;*/
num[3]=(num[2]-1)/5*4;
if(num[3]%5!=1) /* if(i<=4) */
continue ; /* continue ;*/
num[4]=(num[3]-1)/5*4;
if(num[4]%5!=1)
continue;
break ;
}
cout<<num[0]<<endl ;
}
void fish_total2()
{
/* 上面是按照扔鱼的正向顺序思考的 ,也可以反向思考 */
int num2[5];
for(num2[4]=6;;num2[4]+=5) /* num[4]枚举的步数为5,同时又是4的倍数,步长=5 * 4 =20 也可以是 4 * 4 = 16*/
{
int i=4;
for(;i>=1;i--)
{
if(num2[i]%4!=0)
break ;
num2[i-1]=num2[i]/4*5+1;
}
if(i>=1)
continue ;
break ;
}
cout<<num2[0]<<endl ;
}
int main()
{
fish_total() ;
fish_total2() ;
return 0 ;
}