对于N个数,我们把递增自然数(0、1、2、3、……、N)称为顺序数列;对顺序数列中的每一个数,将其二进制倒序后转化为十进制,称为倒叙数列。
下面,以N=8举例,顺序序列为:0,1,2,3,4,5,6,7。顺序序列的二进制序列为:000,001,010,011,100,101,110,111对顺序序列的二进制序列每一个元素倒叙:000,100,010,110,001,101,011,111对上一序列的每一个元素求十进制,即为倒位叙列:0,4,2,6,1,5,3,7
更直观的展示:倒位序列 -----------顺序序列 0(000)----------- 0(000) 4(100)----------- 1(001) 2(010)----------- 2(010) 6(110)----------- 3(011) 1(001)----------- 4(100) 5(101)----------- 5(101) 3(011)----------- 6(110) 7(111)------------7 (111)
可以发现,顺序序列的二进制序列,其下一个数是上一个数最低位加1并由低位向高位进位得到,而倒位序列的二进制序列,其下一个数是上一个数在最高位加1并由高位向低位进为而得到的。 算法描述:在N个数中,若已知某数的倒序数是J,求下一个倒序数,应先判断J的最高位是否为0,与k=N/2进行比较即可得到结果。如果k>J,说明最高位为0,应把其变成1,即J+N/2,这样就得到倒序数了。如果k<=J,即J的最高位为1,将最高位置为0,即J-N/2,再判断次高位;与k=N/4进行比较,若为0,将其变位1,即J+N/4,即得到倒序数,如果次高位为1,将其化为0,再判断下一位......
#include
#include
using namespace std;
int x[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int y[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int N = 8;
int main()
{
int i,j,k;
int temp;
for(j=0,i=0;i= k) //如果k<=j,表示j的最高位为1
{
j = j-k; //把最高位变成0
k = k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为0
}
j = j+k; //把0改为
}//for()
for(i = 0 ; i < N ; ++ i)
{
printf("%2d %2d
" , i , x[i]) ;
}
return 0 ;
}