元旦大放送之递归函数(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%30)
{
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);

}

}

posted @ 2021-01-03 17:39  empty_thought  阅读(130)  评论(0)    收藏  举报