正如标题所说,我必须写一个数字作为2的递增幂的总和。
For instance, if I input 10, 25 , 173
10 = 2 + 8
25 = 1 + 8 + 16
173 = 1 + 4 + 8 + 32 + 128
所以这就是我所做的:
#include <iostream>
using namespace std;
int x,c;
int v[500];
void Rezolva(int putere)
{
if(putere * 2 <= x)
Rezolva(putere * 2);
if(x - putere >= 0)
{
c++;
v[c] = putere;
x -= putere;
}
}
int main()
{
cin >> x;
c = 0;
Rezolva(1);
for(int i = c; i >= 1; i--)
cout << v[i] << " ";
return 0;
}
我有一个程序可以为我的代码提供一些测试并验证它是否正确。对于一个测试,它说我退出阵列。有没有办法摆脱阵列或解决这个问题?如果我没有使用该数组,它将按降序排列。
错误不是编译器错误。 当我的程序检查代码上的一些测试时,我收到了致命的信号11
答案 0 :(得分:0)
对于高于10 ^ 9的值,程序崩溃,因此您需要从int更改为long long。
#include <iostream>
using namespace std;
long long x,c;
long long v[500];
void Rezolva(long long putere)
{
if (putere * 2 <= x)
Rezolva(putere * 2);
if (x - putere >= 0)
{
v[c++] = putere;
x -= putere;
}
}
int main()
{
cin >> x;
c = 0;
Rezolva(1);
for(int i = c - 1; i >= 0; i--)
cout << v[i] << " ";
return 0;
}
总而言之,原因就是一个简单的溢出。
答案 1 :(得分:0)
这是一个简单的溢出。顺便说一句,更方便的方法是long long unsigned int
#include <bitset>
unsigned long long x = input;
std::cout << x << " = ";
std::string str = std::bitset<64>(x).to_string();
for (int i = str.size()-1; i >= 0; --i)
if(str[i]-'0')
std::cout << (2ull << i) << " + ";
if (x)
std::cout << char(8)<<char(8) << std::endl; //DELETING LAST "+" for non-zero x
else
std::cout << "0\n";
答案 2 :(得分:-1)
如果你有一个固定大小的整数(例如int
等),那么你可以从2的最大可能功率开始,如果你的数字大于那个功率,则减去2的幂。然后转到下一个力量。
这类似于您通常从最重要的数字开始自己编写数字的方式。所以也适用于如何以16(十六进制),10,二进制文字等方式打印数字
int main() {
unsigned x = 173;
std::cout << x << " = ";
bool first = true;
// get the max power from a proper constant
for (unsigned power = 0x80000000; power > 0; power >>= 1)
{
if (power <= x)
{
if (!first) std::cout << " + ";
std::cout << power;
x -= power;
first = false;
}
}
assert(x == 0);
std::cout << std::endl;
}
输出:
173 = 128 + 32 + 8 + 4 + 1