不信CSDN真的无人可以理解这种算法的思路!请高人出山!!
这个题目来自信息学奥赛普及组初赛最后一题,原题是用pascal语言写的
翻硬币: 一摞硬币共有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后放回原处。在取3枚,取4枚……直至m枚。然后在从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中每一枚又是正面朝上为止。例如,m为1时,翻两次即可。
输 入:仅有的一个数字是这摞硬币的枚数m ,0< m <1000。
输 出:为了使这摞硬币中的每一枚都是朝正面朝上所必须翻的次数。
输入样例:30 输出样例:899
int solve(int m)
{ int I,t,d,s; int flag;
if(m==1) s=2 ;
else
{ d=2*m+1; t=2; I=1; flag=0;
do
{ if(t==1)
{ s= I*m ; flag=1;}
else if( t=2*m )
{ s=I*m-1; flag=1; }
else t= (t*2)%d ;
I=I+1;
} while(!flag)
}
return s;
}
void program1( )
{ int m;
scanf(“%d”,&m);
if( m>0 &&m<1000)
printf(“%d\n”,solve(m) );
}
我GOOGLE了很久,包括英文的文章,没有什么收获,看来没有什么特别NB的人真正研究这个,或者研究出来了,只是不愿意说(比如出题的那个家伙,他肯定极其深刻地理解了这个思路);
请教大家I,d,t的含义
说说思路也可以
可以看一下以前讨论的
http://community.csdn.net/Expert/topic/3429/3429252.xml?temp=.9563257
最后的zxlzxlzxl兄的见解很有水准,但兄弟我实在太笨(大家见笑),再请牛人讲解!谢谢了!