我必须编写一个程序,显示一些用格雷码编码的数字。我已经在这个页面中找到了用C ++编写的算法(https://www.geeksforgeeks.org/given-a-number-n-generate-bit-patterns-from-0-to-2n-1-so-that-successive-patterns-differ-by-one-bit/)。
但我想创建一种新方法来删除连续两个“1”并且在其末端(左侧和右侧)有“1”的数字。
示例:对于n = 3,我们得到这个数字:
int m = pow(2,n);
int vector[m][n];
现在我要删除这些数字:011,110,111,101并显示列表中提醒的其他数字。
我的想法是创建一个矢量矢量。例如,当n = 3时:{{000},{001},{011},{010},{110},{111},{101},{100}}。
尺寸如下:
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; }
}
}
例如:vector [0] [1] = {0}和vector [1] [2] = {1}如果我的尺寸正确的话。
现在要删除连续两个“1”并且在其末端有“1”的数字,我可以使用此代码:
for (var q = 0; q < array.length; q++) {
arraySymb[k] = array[q].toUpperCase() ;
break;
}
现在的问题是我不知道如何将结果存储在我的向量中用C ++编写的格雷码中,或者可能有一种方法可以在不使用向量的情况下比较此代码中的两个数字。
答案 0 :(得分: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
答案 1 :(得分:0)
不使用位操作,这肯定会更快,因为你有一个向量向量,执行删除的一种方法是使用std::adjacent_find使用谓词来查找相邻的1,并使用{{ 3}}删除那些符合相邻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
接管并完成其余的工作。