样例输入:
13
样例输入:
0
1
4
5
8
9
12
13
思路分析:
这道题大体就是进制转换然后按位 d f s dfs dfs。进制转换比较好理解,不懂得可以自行 b d f s ( 百度优先搜索 ) bdfs(百度优先搜索) bdfs(百度优先搜索)一下。
代码:
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
set<long long>st;//因为升序输出,所以用set自动排序+去重
string a,str="000000000000000000000000000000000000000000000000000000000000";
long long n;
long long zshi(string s){//二进制转十进制
long long ans=0;
for(long long i=0;i<a.size();i++){
char t=s[i];
if(t>='0'&&t<='9') ans=ans*2+t-'0';
else ans=ans*2+t-'a'+10;
}
return ans;
}
string zer(long long n){//十进制转二进制
string ans="";
do{
int t=n%2;
if(t>=0&&t<=9) ans+=t+'0';
else ans+=t-10+'a';
n/=2;
}while(n!=0);
reverse(ans.begin(),ans.end());
return ans;
}
void dfs(long long x){//x表示二进制第几位
if(x>=a.size()){
st.insert(zshi(str));//如果合法,转十进制,放入set
return;
}
if(a[x]=='1'){//如果a[x]是1,str[x]也可以是1
str[x]='1';
dfs(x+1);
str[x]='0';
}
dfs(x+1);
return;
}
int main(){
cin>>n;
a=zer(n);//先转二进制
for(long long i=0;i<a.size();i++){
str[i]='0';
}
dfs(0);
for(set<long long>::iterator it=st.begin();it!=st.end();it++){
cout<<*it<<endl;//迭代器遍历输出
}
return 0;
}
下一篇:上学