小单刷题笔记之天平称重 (巧用进制)

题目:

        用天平称重时,我们希望尽可能少的砝码组合称出尽可能多的重量,如果有无限个砝码,但它们的重量是1,3,9,27..等三的指数幂,神奇的是用它们组合可以称出任意的重量。本题要求实现,用户给出重量,给出砝码组合的方案。

例如:用户输入5,程序输出:9-3-1;

这道题拿到以后我先自己随便写了一个暴力解法

写的很乱而且很慢,就不放在上面了。

思路:

这道题可以往进制转换,我们把用户制定的重量转换成三进制

那么我们会发现一个很有意思的规律。

比如,用户输入5,转换成三进制形式为0 0 1 2

我们把三进制位上是“2”的数,变成-1

向前进一位,变成0 0 2 -1,再进行上述操作,变成0 1 -1 -1,

好的有趣的现象来了,把这个“三进制数”按位输出,我们可以得到:

9-3-1=?

好了算一算等于几,哈哈,等于5对不对!

是不是挺有趣的,这要是写暴力的话要写好长好长的代码,

所以学算法的时候多刷一些有趣的题目,看一些有趣的题解,

AC以后的喜悦,真的超级开心的好叭!

代码如下:

#include<iostream>
#include<cstring>
#include<algorithm> 
#include<cmath>
using namespace std;
string threebit(int x){//转成三进制的函数
	string a;
	while(x){
		char c=x%3+'0';
		a+=c;
		x/=3;
	}
	reverse(a.begin(),a.end());//翻转一下字符串
	return a;
	
}
int main(){
	int n;
	cin>>n;
	string n3=threebit(n); 
	
	
	for(int i=n3.length()-1;i>=0;i--){
		if(n3[i]=='2'){
			if(i!=0){
			n3[i]='4';//这里用4代替-1
			n3[i-1]=n3[i-1]+1;}
			else{
			n3[i]='4';
			n3='1'+n3;	//等于0的话说明到了最后一位,要在头部添加一个'1'
			}
		}
		
	}	

	int len=n3.length();
	
	for(int i=0;i<len;i++){
		if(n3[i]=='1'){
			if(i!=0){
			cout<<"+"<<pow(3,len-1-i);}
			else{
			cout<<pow(3,len-1-i);//处理一下输出就好了,第一个不要输出“+”号
			}
		}
		if(n3[i]=='4'){
			cout<<"-"<<pow(3,len-1-i);//
		}
	}
	
	
	
	return 0;
}

这样就OK啦,我会定期分享一些刷题过程中我觉得有趣且有用的小技巧,一起加油,冲!

拜拜~今天又是快乐的一天~哈哈哈哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值