元旦大放送之递归函数(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);
		
		
		
	}
	
	
	
}
posted @ 2021-01-03 17:39  empty_thought  阅读(105)  评论(0)    收藏  举报