作为第一题 ,虽然比往年的难 但是 居然难了我一个小时啊。。。作为机构老师,简直奇耻大辱。
看到题目我飞快的想到这不就是把数转成二进制吗?不到10分钟我就敲好了代码。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int num[30];
int main()
{
int n;
cin>>n;
int cnt=0;
if(n%2==0)
{
while(n)
{
num[cnt]=n%2;
n=n/2;
cnt++;
}
for(int i=cnt-1;i>=0;i--)
{
if(num[i])
cout<<pow(2,i)<<" ";
}
}
else
{
cout<<-1;
}
return 0;
}
然而现实如此打脸,洛谷说 最后5个点过不去,很明显是大数据的时候过不去了,但题目说了 n才 10的7次方 ,int必然是可以hold住的。
经过了艰辛的试错 整整一个小时 我才知道了这个坑的原因。
pow(2,i) !!!
它的返回值是double 也就是说当这个数很大的时候会返回指数形式 2e34这类的表达 ,而题目要求是整数哪怕 45667883这样的整数都可以。
所以我们需要强转成int就可以AC了
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int num[30];
int main()
{
int n;
cin>>n;
int cnt=0;
if(n%2==0)
{
while(n)
{
num[cnt]=n%2;
n=n/2;
cnt++;
}
for(int i=cnt-1;i>=0;i--)
{
if(num[i])
{
int x=pow(2,i); //只要这里强转一下就行,啊啊啊,坑无处不在
cout<<x<<" ";
}
}
}
else
{
cout<<-1;
}
return 0;
}
这个典型错误必然要放入今年的课件里。。。。。