C ++ [Recursive]将数字写为2

时间:2017-08-30 10:17:56

标签: c++ arrays recursion

正如标题所说,我必须写一个数字作为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

3 个答案:

答案 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