小b有一个数n,现在她想把n的每一位重排列,使得得到的结果为2的幂次。
请问小b能得到2的幂次吗?
注意重排列后不允许有前导0。
样例解释:46重排列成64,为2^6。
收起
输入
输入一个数N,其中1≤N≤10^9
输出
满足条件,输出“true”; 不满足,则输出“false”。
输入样例
46
输出样例
true
思路:这个题目要求的是经过了重新排列之后的一个判断,判断是不是2的幂次,
我觉得,这个题目做起来的话,需要两步,
首先解决的是有关2的幂次的计算,这个的话,可以试一下那个x&(x-1)==0如果等式成立那么这个数就是2的幂次了
下一步解决的就是某一个数的全排列的问题了,
我是用的一个函数做的,也就是下面代码中的 那个函数,要注意的是,那个函数只能是一开始的时候字符串的顺序是从大到小的,其实也有一个从小到大的,其实我们到最后保证有序的话,总要有一个sort的排列,用哪一个也就无所谓了。
最后就判断出结果就可以了
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int cmp(char a,char b)
{
return a>b;
}
int main()
{
char a[10];
cin>>a;
int len=strlen(a);
sort(a,a+len,cmp);
int sum;
do
{
/*for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;*/
sum=0;
for(int i=len-1;i>=0;i--)
{
sum*=10;
sum+=(a[i]-'0');
}
if((sum&(sum-1))==0)
{
printf("true\n");
return 0;
}
}
while ( prev_permutation(a,a+len));
printf("false\n");
return 0;
}