2767.优秀的拆分
这题用二进制的方法较简单,也容易理解。
别的简单方法可能有点难理解。 别听我乱 bibi
废话不说了,看代码和解释。
#include<bits/stdc++.h> //万能头万岁
using namespace std;
const int N = 10000010; //数据范围。
int a[N] , b[N]; //定义两个数组,a 代表二进制数 ; b 代表二的n次方。
long long n; //我怕输入太大,定义了个long long。
int main()
{
scanf("%ld" ,&n); //输入
b[1] = 1; //二的i - 1次方,2的0次方等于1
for(int i=2 ;i<=n ;i++ ) b[i] = b[i - 1] * 2; //初始化b数组
if(n % 2) printf("%d" ,-1); //不难发现,奇数都是不可以拆分的,只有偶数可以拆分
else
{
int k=0; //k 代表二进制数的位数
while(n != 0) // 等于0就表示十进制转二进制转完了。
{
k++;
a[k] = n % 2; // 这应该看得懂吧(十进制转二进制:除二取余)
n /= 2; //每次转完一位都要刷新一下n。
}
for(int i=k ;i>=2 ;i-- ) if(a[i]) printf("%d " ,b[i]); //输出就好了,偶数都可以拆分,不用考虑其他因素了。
}
return 0;
}