分解二進制數字 n 成兩個數字 a(n), b(n) +

Splitting Numbers(數字分解)
分解二進制數字 n 成兩個數字 a(n), b(n) 的定義如下:
若 0<= i1<i2<... <ik分別代表數字 n 中位元值為 1 的位元索引(最小索的引值為0)。
然後數字 a(n) 中位元值為 1 的位元索引分別為i1, i3, i5, ...
以及數字 b(n) 中位元值為 1 的位元索引分別為i2, i4, i6, ...
(與具有索引0的至少顯著位)在N屬於的位元1。
然後a(n)為索引位元是1的i1,i3,i5,......以及b(n)為索引位元是1的i2,i4,i6,......
例如,若數字 n 的二進制數為 1101101012,則 a = 0100100012 和 b = 1001001002。
輸入規範
每個測試案例含單一的整數 n 其值介於 1 和 231 - 1 之間。整數 0 代表終止輸入,不用處理。
輸出規範
每個測試案例輸出一行,包含整數 a(n) 和 b(n) 用一個空格隔開,皆以十進制格式輸出。

我晕,这么复杂的,建议哪个算法的老师看看,帮你写一下

或者你总结个大家都通用的算法,这样的例子比较多

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "math.h"
#include <iostream>

using namespace std;

void shownum(int num)
{
    int shift = 1 << (int)log2(num);
    while (shift > 0)
    {
        cout << num / shift;
        num = num % shift;
        shift /= 2;
    }
    cout << endl;
}

int tonum(string num)
{
    int r = 0;
    for (int i = 0; i < num.length(); i++)
    {
        r *= 2;
        r += num[i] == '0' ? 0 : 1;
    }
    return r;
}

int _tmain(int argc, _TCHAR* argv[])
{
    string input = "110110101";
    string mask1 = "101010101";
    string mask2 = "010101010";
    int x = tonum(input) & tonum(mask1);
    int y = tonum(input) & tonum(mask2);
    shownum(x);
    shownum(y);
    return 0;
}


100010101
10100000
Press any key to continue . . .

你的例子好像是错的,或者你的描述是错的。