题目:
用天平称重时,我们希望尽可能少的砝码组合称出尽可能多的重量,如果有无限个砝码,但它们的重量是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啦,我会定期分享一些刷题过程中我觉得有趣且有用的小技巧,一起加油,冲!
拜拜~今天又是快乐的一天~哈哈哈哈哈哈