1

我必须编写一个程序来显示一些格雷码编码的数字。我已经在此页面中找到了用 C++ 编写的算法(https://www.geeksforgeeks.org/given-a-number-n-generate-bit-patterns-from-0-to-2n-1-so-that-连续模式不同一位/)。

但是我想创建一种新方法来删除连续有两个“1”并且末端有“1”的数字(左和右)。

示例:对于 n = 3,我们得到以下数字:

000
001
011
010
110
111
101
100

现在我想删除这个数字: 011 、 110 、 111 、 101 并在列表中显示其他数字。

我的想法是创建一个向量向量。例如,当 n = 3 时:{{000},{001},{011},{010},{110},{111},{101},{100}}。

对于大小,它将是这样的:

int m = pow(2,n);
int vector[m][n];

例如:vector[0][1] = {0} 和 vector[1][2] = {1} 如果我的尺寸是正确的。

现在要删除连续有两个“1”并且末端有“1”的数字,我可以使用以下代码:

while (i < m){
for (j=0; j<n-1; j++){
if (vector[i][j]==vector[i][j+1]==1 && vector[i][0]==vector[i][n-1]==1 ) 
    i=i+1; //Don't show this number
else { cout <<vector[i][j] << endl; i=i+1; }
}
}

现在的问题是我不知道如何将结果存储在我的向量中用 C++ 编写的格雷码中,或者也许有一种方法可以在不使用向量的情况下比较此代码中的两个数字。

4

2 回答 2

0

当您获得更大的字符串时,这将是一项额外的工作,并且代码阅读起来并不简单。创建一个简单的面具怎么样?将一对连续的 1 位移动数字 (num) 的长度。

mask = 0b11000      // fill in the correct quantity of 0s
end_mask = 0b10001

while mask > 1
    if (num && mask) == mask
        remove num from array
    mask = mask >> 1

if num && end_mask == end_mask
    remove num from array
于 2017-12-28T00:36:56.360 回答
0

不使用位操作,这无疑会更快,因为您有一个向量向量,执行删除的一种方法是使用std::adjacent_find使用谓词来查找相邻的 1,并使用std::remove_if删除那些符合具有相邻 1 标准的向量。

这是一个例子:

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>

bool findOnes(const std::vector<int>& v)
{
    // less than 2 digits, so can't do anything
    if ( v.size() < 2 )
       return false;

    // test extremes
    if ( v.front() == 1 && v.back() == 1 )   
       return true;

    // check if there are adjacent 1's
    return std::adjacent_find(v.begin(), v.end(), [&](int n1, int n2)
                             { return n1 == 1 && n2 == 1; }) != v.end();
}

int main()
{
    //test 
    std::vector<std::vector<int>> vect = {{0,0,0},{0,0,1},{0,1,1},{0,1,0},{1,1,0},{1,1,1},{1,0,1},{1,0,0}};

    // erase the vectors that match the criteria
    vect.erase(std::remove_if(vect.begin(), vect.end(), findOnes), vect.end());

    // show the final results
    for ( auto& i : vect )
    {
       std::copy(i.begin(), i.end(), std::ostream_iterator<int>(std::cout, " "));
       std::cout << "\n";
    }
}

现场示例

基本上,如果adjacent_find没有找到相邻的 1,则返回的迭代器将为end(). 因此,在findOne谓词函数中,在对大小和极值进行简单测试后,adjacent_find接管并完成其余的工作。

于 2017-12-28T01:42:25.083 回答