题目:

小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;
}