A36.优秀的拆分 题解
2026-10-06 11:16:35
发布于:广东
82阅读
0回复
0点赞
整道题的思路:
一、整体思路
分两种情况讨论:
1.当n是奇数时,一定没有拆分的方案,理由如下:
由于2的k次方(k > 0)永远是偶数,所以,如果有一个最接近但是比n小的数,(设这个数是2的k次方),
那么,
n - 这个数 = 1 (恒成立)
即 2的0次方,
题目已经明确说明了,0次方不符合条件(题目要求是正整数),所以输入完所有东西之后,直接判断,如果是奇数,直接输出 -1,最后接上一个return 0;就可以了
2.当n是偶数时,一定有拆分的方案,理由也和情况1一样,我就不重复了。
二、考虑 n 是偶数这一情况
因为题目已经说明,n 小于等于 10的7次方,那么我们随便取一个数(令这个数为 r 吧),使得2的 r 次方 > 10的7次方,那这个 r 我取了30(凭感觉取的),只要满足 2的 r 次方 > 10的7次方 就可以了,r 没有唯一标准。
取好 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;
}
提醒:不要复制!!!
这里空空如也






有帮助,赞一个