/*N=11情况下有35584个解,最后那个解是
b6a293286375ba94857141。以下是递归版
*/
#define N 11
#include<stdio.h>
#include<math.h>
unsigned long MAX;
void fun(int ix)
{
unsigned long a=1+pow(2,ix+1);
static unsigned long n[N],s=0;
if(ix)
{
for(n[ix-1]=0;a<MAX;a+=a,n[ix-1]++)
if(s+a==(s|a))
{ s|=a;
fun(ix-1);
s^=a;
}
}
else if(s==MAX)
{
static long ans;
char i,s[2*N+1]={0};
for(i=0;i<N;i++)
s[2*N-3-n[i]-i]=s[2*N-1-n[i]]=
(i>=9?i-9+'a':i+'1');
printf("%ld: %s\n",++ans,s);
}
}
void main()
{
MAX=pow(4,N)-1;
fun(N);
}
嗯,硬解多元一次方程速度比我那个速度快。因为没一次操作只是数值比较,比我那个又链表又排列的省时间。算到11时已经比较明显了。整数能承受的范围内没什么问题。同时内存管理也简单。
http://myajax95./