1 条题解

  • 0
    @ 2023-12-25 19:20:06
    #include <stdio.h>
    #include <stdbool.h>
    #include <math.h>
    // 判断一个数是否为2的整数次幂
    bool is_power_of_2(int n) {
        return (n & (n - 1)) == 0 && n > 0;
    }
    // 求2的幂次方
    int power_of_2(int n) {
        return pow(2, n);
    }
    // 判断数组中是否有重复的元素
    bool has_duplicate(int arr[], int n) {
        for (int i = 0; i < n - 1; i++) {
            for (int j = i + 1; j < n; j++) {
                if (arr[i] == arr[j]) {
                    return true;
                }
            }
        }
        return false;
    }
    // 将一个数拆分成若干个不同的2的幂次方之和,并输出拆分后的数字
    bool split_power_of_2(int n, int arr[], int* len) {
        if (n <= 0) {
            return false;
        }
        int index = 0;
        for (int i = 0; i < 31; i++) { // 2的幂次方最大为2^31
            if (n == 0) {
                break;
            }
            if ((n & 1) == 1) {
                arr[index++] = power_of_2(i);
            }
            n >>= 1;
        }
        *len = index;
        // 输出拆分后的数字
        for (int i = *len-1; i >=0; i--) {
            printf("%d ", arr[i]);
        }
        printf("\n");
    
        return true;
    }
    // 判断一个数是否能被拆分成若干个不同的2的幂次方之和
    bool is_perfect_power_of_2(int n) {
        int arr[31] = { 0 }; // 用于存储2的幂次方
        int len = 0;
        if (!split_power_of_2(n, arr, &len)) {
            return false;
        }
        if (has_duplicate(arr, len)) {
            return false;
        }
        return true;
    }
    int main() {
        int n;
        scanf("%d", &n);
        if (n%2==0) {
            is_perfect_power_of_2(n);
        }
        else {
            printf("-1");
        }
        return 0;
    }
    

    微抽象了

    • 1

    信息

    ID
    422
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    502
    已通过
    128
    上传者