1 条题解
-
0
#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
- 上传者