第二、三次上机
前言
自己写的上机作业,可以用于参考
目前处于初步学习中,写的不好见谅
一、题目
二、解题
1.思路
因为2^0不是2的正整数次幂,所以可以最优分解的数都不是奇数(分解后不含1)
用循环从大到小开始判断,设置循环变量i,对2^i进行判断
若n>2^19,则最优分解含有2^19,将2^19输出并将n-2^19后得到的结果与2^18进行判断
若n<2^19,则n的最优分解不含2^19,不进行输出操作,将n与后一位2^18进行判断
若n>2^18,则最优分解含有2^18,将2^18输出并将n-2^18后得到的结果与2^18进行判断
…………
一直判断到i=1
2.代码
ps:这题在西电上机的网站上提交时要选择GNU C/C++的编译,Visual C++的会编译错误
代码如下(示例):
#include<stdio.h>
#include<math.h>
int main()
{
int i,n,result;
scanf("%d",&n);
if(n%2!=0)printf("-1");//如果n是奇数,输出-1
else
{
for(i=19;i>=1;i--)//从i=19开始判断
{
if(n>=pow(2,i))
{
result=pow(2,i);
printf("%d ",result);
n=n-result;
}
if(n==0)break;//n如果被分解完了,则结束循环
}
}
return 0;
}