问题描述
- 分解二進制數字 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 . . .
解决方案三:
你的例子好像是错的,或者你的描述是错的。
解决方案四:
我晕,这么复杂的,建议哪个算法的老师看看,帮你写一下
或者你总结个大家都通用的算法,这样的例子比较多
时间: 2024-09-05 13:24:19