//只有5个砝码,1,3,9,27,81;表示1-121终点数字
//例:19=27-9+1
//因为为3的倍数,可以像上一题一样,转为3进制写这道题,
//余数有0,1,2,没有重为2的砝码,2=3-1;
//不要想多凡是余数为 2 被除数就加 3,也就是商+1,余数为-1;
#include<bits/stdc++.h>
using namespace std;
void decToR(int n,int r);
int a[10000];
int cnt=0;
int main(){
int n;
cin>>n;
decToR(n,3);//转三进制
//检测是否转正确
for(int i = cnt-1;i>=0;i--)
cout<<a[i];
cout<<endl;
bool flg=true;//第一个字符特殊标记
for(int i = cnt-1;i>=0;i--){
if(flg){
flg = false;
if(a[i]==1)
cout<<pow(3,i);
else
cout<<"-"<<pow(3,i);
}
else if(!flg && a[i]!=0){
if(a[i]==1)
cout<<"+"<<pow(3,i);
else
cout<<"-"<<pow(3,i);
}
}
return 0;
}
void decToR(int n,int r){
while(n){
int t = n%r;
if(t==2){
a[cnt++]=-1;
n = n/r +1;
}
else{
a[cnt++]=t;
n /= r;
}
}
}
不是很正确的dfs写法
#include <iostream>
#include <vector>
using namespace std;
int a[5]={1,3,9,27,81};
int n;
vector<int>v;
bool flg=true;
void dfs(int idx,int sum){
if(sum == n && flg==true){
flg==false;
int len = v.size();
cout<<v[0];
for(int i=1;i<len;i++){
if(v[i]>0)
cout<<"+"<<v[i];
else cout<<v[i];
}
}
if(idx<0) return ;
//0
dfs(idx-1,sum);
//正
v.push_back(a[idx]);
dfs(idx-1,sum+a[idx]);
v.pop_back();
//负
v.push_back(-a[idx]);
dfs(idx-1,sum-a[idx]);
v.pop_back();
}
int main() {
cin>>n;
dfs(4,0);
return 0;
}