题目:
小b有一个数n,现在她想把n的每一位重排列,使得得到的结果为2的幂次。
请问小b能得到2的幂次吗?
注意重排列后不允许有前导0。
样例解释:46重排列成64,为2^6。
输入
输入一个数N,其中1≤N≤10^9
输出
满足条件,输出“true”; 不满足,则输出“false”。
输入样例
46
输出样例
true
题解:
当n的数字个数与某2的次幂数字个数相同时,比较各个数字出现的次数,如果相同则为true
代码:
#include<stdio.h>
#include<algorithm>
#include<cmath>
using namespace std;
int b[10];
int a[10];
int len(int n){
int l = 0;
while(n){
l++;
n /= 10;
}
return l;
}
bool cmp(){
for(int i = 0; i < 10; i++){
if(a[i] != b[i])
return false;
}
return true;
}
int mi(int m){
int now = 1;
for(int i = 0; i < m; i++)
now *= 2;
return now;
}
void get(int p){
for(int i = 0; i < 10; i++)
b[i] = 0;
while(p){
b[p%10]++;
p /= 10;
}
}
int main()
{
int n;
scanf("%d",&n);
bool flag = false;
int i = 0;
int p = n;
while(p){
a[p%10]++;
p /= 10;
}
while(1){
if(len(mi(i)) == len(n)){
get(mi(i));
if(cmp()){
flag = true;
break;
}
}
if(len(mi(i)) > len(n))
break;
i++;
}
if(flag)
printf("true");
else
{
printf("false");
}
return 0;
}