//想到一个算法,在网上居然没有找到类似的解法。如果要转换成纯C语言的,只需要将几个打印的地方替换一下就行了。
void switchpos(int * arr, int x, int y)
{
int tempv;
tempv = arr[x];
arr[x]=arr[y];
arr[y] = tempv;
}
#define MAX_COUNT 8
int arr[MAX_COUNT]={1,2,4,8,16,32,64,128};
void printBinaryForInteger(int &integer)
{
int k,a=0;
int b[8]={0,0,0,0,0,0,0,0};
while (integer!=0)
{
k=integer%2;
b[a++]=k;
integer=integer/2;
}
a=8 ;
while (a>0)
{
cout<<b[--a];
}
cout<<endl;
}
int all_count=0;
void getlist(int *intarr,int *arrhead,int n)
{
int *arrtemp= new int[n];
int *headtemp= new int[MAX_COUNT];
for (int x=0;x<MAX_COUNT;x++)
headtemp[x]= arrhead[x];
for (int x=0;x<n;x++)
{
arrtemp[x]=intarr[x];
}
if (n>1)
{
for (int i=0;i<n;i++)
{
if (i!=0) //第一次不用颠倒首元素的位置
{
switchpos(arrtemp,0,i);
for (int x=0;x<n;x++)
{
headtemp[MAX_COUNT-n+x]= arrtemp[x];
}
bool bFind=false;
for (int x=0;x<MAX_COUNT;x++)
{
for (int y=1;y<MAX_COUNT;y++)
{
if ((x+y<MAX_COUNT&& headtemp[x]*pow(2,y)==headtemp[x+y])
|| (x-y>=0&& headtemp[x]*pow(2,y)==headtemp[x-y]))
{
bFind=true;
break;
}
}
if (bFind) break;
}
if (!bFind)
{
all_count++;
for (int x=0;x<MAX_COUNT;x++)
{
int tempi= headtemp[x];
printBinaryForInteger(tempi);
}
cout<<"--------------"<<all_count<<endl;
}
}
headtemp[MAX_COUNT-n]= arrtemp[0];
getlist(arrtemp+1,headtemp, n-1);
}
}
delete []arrtemp;
delete []headtemp;
}
int main(void)
{
int arrhead[8];
getlist(arr,arrhead,MAX_COUNT);
getchar();
return 0;
}