元旦大放送之递归函数(2)
Harry Potter想立刻赶到学校去,假设他和学校处于一条直线上,他一开始处于0点,学校位于X点。在一个单位时间内他可以往前走1格,或者使用魔法把自己变到目前坐标2倍的地方。请问他到学校最少需要多少时间?
这一题反向分析,偶数直接除,奇数减一再除,与上次求幂指数很相似
如果这一题改变题目,往下既能走一步,也能走上一步 步数的两倍,对距离直接整成二进制,统计1的个数就行了
include <stdio.h>
int main()
{
int k;
scanf("%d",&k);
long long result=1;
for(int i=0;i<k;i++)
{
result*=2;
}
result=(result-k-1)*2;
printf("%d",result);
}
居然有假币!!!
事情是这样的,现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊。老王这就去买猪肉,结果找来的零钱中有假币!!!可惜老王一不小心把它混进了一堆真币里面去了。现在知道假币的重量比真币的质量要轻。给你一个天平,请用最快的时间把那个可恶的假币找出来。
如果共有3枚硬币,选择任意取2个放天平上称量一下。
因为假币的重量比较轻。
如果天平不平衡,则较轻的那枚就是假币。
如果天平平衡,则说明这两枚硬币都是真的,而剩下那枚是假币。
这个提示告诉我们,分堆的方法是三三分,不是二二分,三堆称完其中两堆,一定知道假币在三堆中的哪一堆
include <stdio.h>
int sum;
void three_devide(int n)
{
if(n>1)
{
if(n%3==0)
{
sum++;
three_devide(n/3);
}
else if((n+1)%3==0)
{
sum++;
three_devide((n+1)/3);
}
else if((n+2)%3==0)
{
sum++;
three_devide((n+2)/3);
}
}
}
int main()
{
int n;
while((scanf("%d",&n)!=EOF))
{
sum=0;
if(n==0) break;
three_devide(n);
printf("%d\n",sum);
}
}

浙公网安备 33010602011771号