> 文档中心 > 天平称重 (巧用进制)

天平称重 (巧用进制)


题目:

        用天平称重时,我们希望尽可能少的砝码组合称出尽可能多的重量,如果有无限个砝码,但它们的重量是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#include#include #includeusing 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代替-1n3[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啦,我会定期分享一些刷题过程中我觉得有趣且有用的小技巧,一起加油,冲!

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

素彩网