求大佬!
輸入一個原始二進制字串(char型別,不是string),窮舉出非零位產生的所有可能
例子:
原始資料:
0001101
結果:
0000000
0000001
0000100
0000101
0001000
0001001
0001100
0001101
uj5u.com熱心網友回復:
用進制轉換即可實作,首先用二進制轉十進制,再從十進制0開始轉到二進制,截至二進制轉的十進制值.uj5u.com熱心網友回復:
int main() {
unsigned char arr[256]{ 0 };
unsigned char x = 0xd;
for (int i = 0; i < 255; i++) {
unsigned int b = i & x;
arr[b] = 1;
}
for (int i = 0; i < 256; i++) {
if (arr[i])
printf("%2x\r\n", i);
}
return 0;
}
uj5u.com熱心網友回復:
寫2個函式:二至十六進制轉十進制,十進制轉二至十六進制,然后呼叫這2個函式即可實作.uj5u.com熱心網友回復:
原始二進制字串不限長度?!1萬位1的話,到地球毀滅那天能運行出結果嗎?
uj5u.com熱心網友回復:
如果輸入的位數一定,且比較小,可以利用二樓的方法如果輸入位數可能很大,就先把0剔除吧,然后就只剩下1了,看有幾個,然后從0往上加就行了,就是先產生你標紅的這些數,然后再將之前的0插回即可,這樣應該是最保險的,注意一下插入的技巧即可
uj5u.com熱心網友回復:
我覺得你們都理解錯了...樓主的題目其實是字串操作的問題
#include <iostream>
#include <set>
using namespace std;
set<string> sset;
void traversestr(string str)
{
sset.insert(str);
for (int i = 0; i < 8; ++i)
{
if (str[i] == '1') {
char c = str[i];
str[i] = '0';
traversestr(str);
str[i] = c;
}
}
}
bool checkStr(string str)
{
if (str.length() != 8) {
cout << "input length not match" << endl;
return false;
}
for (int i = 0; i < 8; ++i) {
if (str[i] != '0' && str[i] != '1') {
cout << "input data not available" << endl;
return false;
}
}
return true;
}
int main() {
string str;
do {
cin.clear();
cin >> str;
}while(!checkStr(str));
traversestr(str);
set<string>::iterator it = sset.begin();
for (; it != sset.end(); ++it)
{
cout << *it << endl;
};
return 0;
}
uj5u.com熱心網友回復:
例子就是個很簡單的,正常情況下144位的二進制數,大概里面有20個非零位吧,用整形陣列存放中間變數肯定不行
uj5u.com熱心網友回復:
這個程式我不太清楚你的輸入是什么,我給的例子就比如是輸入101110000010,就會輸出2^5種非零位排列組合產生的二進制字串,而且不是string型別是char陣列
uj5u.com熱心網友回復:
思路我大概懂了,但是程式不會寫。剔除了0之后直接窮舉2^n種組合(n是非零位個數),再把0加回原來的位置。
uj5u.com熱心網友回復:
soga...那你可以把我這個代碼里 checkStr 里約束長度的判斷條件去掉
但是終歸和你想要的不一樣,還是用數學的方法來解吧
uj5u.com熱心網友回復:
大概寫了一個,再根據自己的需求改改應該不是很難了
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX_INPUT_LEN 32
int makeLable(char *input, int *lable)
{
int i = 0;
while(input != NULL && *input != '\0') {
if(*input == '0') {
lable[i++] = 0;
} else if(*input == '1') {
lable[i++] = 1;
} else {
printf("ERROR: invalid input\n");
return -1;
}
++input;
}
return 0;
}
int getOneNum(int *arr, int len)
{
int cnt = 0;
for(int i = 0; i < len; ++i) {
if(arr[i] == 1)
cnt++;
}
return cnt;
}
int int2arr(int num, int *arr, int len)
{
int mask = 1;
for(int i = 0; i < len; ++i) {
if(0 != (int)(num & mask)) {
arr[i] = 1;
} else {
arr[i] = 0;
}
mask <<= 1;
}
}
int getResult(int *lable, int len, int *arr, int oneNum, int *result)
{
int oneIndex = 0;
for(int i = 0; i < len; ++i) {
result[i] = lable[i] == 1 ? arr[oneIndex++] : 0;
}
}
int main()
{
char input[MAX_INPUT_LEN+1] = {0};
fgets(input, MAX_INPUT_LEN, stdin);
int inlen = strlen(input);
if('\n' == input[inlen-1]) {
input[inlen-1] = '\0';
}
inlen = strlen(input);
printf("input: %s\n", input);
printf("inlen = %d\n", inlen);
int lable[MAX_INPUT_LEN] = {0};
if (0 != makeLable(input, lable)) {
printf("ERROR:make lable error\n");
return -1;
}
int oneNum = getOneNum(lable, inlen);
printf("oneNum = %d\n", oneNum);
int max = pow(2,oneNum) - 1;
printf("max = %d\n", max);
int arr[oneNum];
int result[MAX_INPUT_LEN] = {0};
for(int num = 0; num <= max; ++num) {
int2arr(num, arr, oneNum);
getResult(lable, inlen, arr, oneNum, result);
for(int i = 0; i < inlen; ++i) {
printf("%d", result[i]);
}
printf("\n");
}
return 0;
}
uj5u.com熱心網友回復:
供參考,如果不在意順序的話:
#include <stdio.h>
char s[256] , d[256];
void outmystr(int n)
{
if (n < 0)puts(d);
else
{
d[n] = '0';
outmystr(n - 1);
if (s[n] == '1')
{
d[n] = '1';
outmystr(n - 1);
}
}
}
int main()
{
int i=0;
gets_s(s, 256);
while (s[i])
d[i++] = '0';
outmystr(i-1);
return 0;
}
uj5u.com熱心網友回復:
供參考,如果不在意順序的話:
#include <stdio.h>
char s[256] , d[256];
void outmystr(int n)
{
if (n < 0)puts(d);
else
{
d[n] = '0';
outmystr(n - 1);
if (s[n] == '1')
{
d[n] = '1';
outmystr(n - 1);
}
}
}
int main()
{
int i=0;
gets_s(s, 256);
while (s[i])
d[i++] = '0';
outmystr(i-1);
return 0;
}
逛貼吧還是能學到東西的
uj5u.com熱心網友回復:
供參考,如果不在意順序的話:
#include <stdio.h>
char s[256] , d[256];
void outmystr(int n)
{
if (n < 0)puts(d);
else
{
d[n] = '0';
outmystr(n - 1);
if (s[n] == '1')
{
d[n] = '1';
outmystr(n - 1);
}
}
}
int main()
{
int i=0;
gets_s(s, 256);
while (s[i])
d[i++] = '0';
outmystr(i-1);
return 0;
}
大佬輸出是可以的,能否把每個產生的字符陣列存到比如二維字符陣列里,方便以后呼叫呢,真的很感謝你
uj5u.com熱心網友回復:
大概寫了一個,再根據自己的需求改改應該不是很難了
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX_INPUT_LEN 32
int makeLable(char *input, int *lable)
{
int i = 0;
while(input != NULL && *input != '\0') {
if(*input == '0') {
lable[i++] = 0;
} else if(*input == '1') {
lable[i++] = 1;
} else {
printf("ERROR: invalid input\n");
return -1;
}
++input;
}
return 0;
}
int getOneNum(int *arr, int len)
{
int cnt = 0;
for(int i = 0; i < len; ++i) {
if(arr[i] == 1)
cnt++;
}
return cnt;
}
int int2arr(int num, int *arr, int len)
{
int mask = 1;
for(int i = 0; i < len; ++i) {
if(0 != (int)(num & mask)) {
arr[i] = 1;
} else {
arr[i] = 0;
}
mask <<= 1;
}
}
int getResult(int *lable, int len, int *arr, int oneNum, int *result)
{
int oneIndex = 0;
for(int i = 0; i < len; ++i) {
result[i] = lable[i] == 1 ? arr[oneIndex++] : 0;
}
}
int main()
{
char input[MAX_INPUT_LEN+1] = {0};
fgets(input, MAX_INPUT_LEN, stdin);
int inlen = strlen(input);
if('\n' == input[inlen-1]) {
input[inlen-1] = '\0';
}
inlen = strlen(input);
printf("input: %s\n", input);
printf("inlen = %d\n", inlen);
int lable[MAX_INPUT_LEN] = {0};
if (0 != makeLable(input, lable)) {
printf("ERROR:make lable error\n");
return -1;
}
int oneNum = getOneNum(lable, inlen);
printf("oneNum = %d\n", oneNum);
int max = pow(2,oneNum) - 1;
printf("max = %d\n", max);
int arr[oneNum];
int result[MAX_INPUT_LEN] = {0};
for(int num = 0; num <= max; ++num) {
int2arr(num, arr, oneNum);
getResult(lable, inlen, arr, oneNum, result);
for(int i = 0; i < inlen; ++i) {
printf("%d", result[i]);
}
printf("\n");
}
return 0;
}
您這個我看懂了,每個result整數陣列就是答案,但是我想要字符陣列,再全放到一個二維字符陣列里,真的很麻煩了

uj5u.com熱心網友回復:
大佬輸出是可以的,能否把每個產生的字符陣列存到比如二維字符陣列里,方便以后呼叫呢,真的很感謝你
按你說的20個非零位可就要產生1048576行,每行都這么大可就256M大了,你確定要保存在記憶體里?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/269661.html
標籤:C++ 語言
下一篇:Cyv'y求助!!!
