A36.优秀的拆分 题解
2026-07-31 11:54:04
发布于:广东
60阅读
0回复
0点赞
整道题的思路:
一、整体思路
分两种情况讨论:
1.当n是奇数时,一定没有拆分的方案,理由如下:
由于2的k次方(k > 0)永远是偶数,所以如果有一个最接近但是比n小的数,且这个数是2的k次方,那么n - 这个数 = 1 即 2的0次方,题目已经明确说明了,不符合条件,所以输入完所有东西之后,直接判断,如果是奇数,直接输出-1,最后接上一个return 0;就可以了
2.当n是偶数时,一定有拆分的方案,原因也和情况1是一样的,我就不重复了。
二、考虑n是偶数这一情况
因为题目已经说明,n小于等于 10的7次方,那么我们随便取一个数(令这个数为r吧),使得2的r次方 > 10的7次方,那这个r我取了30(凭感觉取的),只要满足 2的r次方 > 10的7次方 就可以了,这个数没有唯一标准。
取好r之后的操作请看代码,有详细注释:
#include <bits/stdc++.h>
using namespace std;
int n;
int main()
{
scanf("%d",&n);
//当n是奇数时
if(n % 2)
{
printf("-1");
return 0;
}
int sum = n;
//当n是偶数时
for(int i = 30;i >= 1;i--)//这个i相当于上文提到的 r
{
int temp = pow(2,i);//计算2的i次方是多少
if(sum >= temp)//保证可以拆出来的数比被拆的数小
{
sum -= temp;
printf("%d ",temp);
}
}
return 0;
}
提醒:不要复制!!!
这里空空如也






有帮助,赞一个