金币
这题思路比较简单,找前k个数的和,只需要先判断k是否比要减去的数大,若更大则每次让k减1,减2,减3...,若结果大于0,就可让sum加上1^2,2^2,3^2...,若k更小了,假设此时减去的数为n,sum便不能完整地加上n*n了,只能加上k个n。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int k,n=1,sum=0;
cin>>k;
while(k>0)
{
sum+=k>n ? n*n:k*n;
k=k-(n++);
}
cout<<sum;
return 0;
}
优秀的拆分
这题使用位运算的方法十分简便,只需要先右移判断判断输入数每一位是否为1,为1就输出1左移这么多位的值即可。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
if(n%2==1 || n==0)
{
cout<<"-1"<<endl;
}
else
{
for(int j=29;j>=0;j--)
{
if(n>>j & 1)
{
printf("%d ",1<<j);
}
}
}
}