构造和为指定值的表达式:±1±2±3±4±5=3 确定符号(二)
tmp[2*i+1][1]=(ret[i][1]<<1)+0;
}
memcpy(ret,tmp,sizeof(tmp));//把修改过的tmp重新写回ret;
retlen = retlen*2;
printarry(ret,retlen/2);
}
}
void FUN(int *inp,int inpnum,int inplen,int ret[][2],int retlen){//刚开始写的,有递归有顺序,不伦不类
printf ( "==================\n" );
printarry(ret,retlen/2);
if(inpnum == inplen) return;
int tmp[MAX][2]={{0}};
int i=0;
for(;i
tmp[2*i][0]=ret[i][0]+inp[inpnum];
tmp[2*i][1]=(ret[i][1]<<1)+1;
tmp[2*i+1][0]=ret[i][0]-inp[inpnum];
tmp[2*i+1][1]=(ret[i][1]<<1)+0;
}
memcpy(ret,tmp,sizeof(tmp));
FUN(inp,++inpnum,inplen,tmp,retlen*2);//这里其实用for循环可以代替,改进版如FUN1();
}
int main(){
int input[] = {1,2,3,4,5};
// FUN(input,0,4,ret,2);
FUN1(input,4,ret,2);
return 0;
}
复制代码
输出结果:
两个函数FUN()和FUN1()输出结果是一样的:
复制代码
xu@xu-ThinkPad-X61:~/algorithm$ gcc 1234eq10.c
xu@xu-ThinkPad-X61:~/algorithm$ ./a.out
==================
ret[0][0]=1,ret[0][1]=1,
ret[1][0]=-1,ret[1][1]=0,
==================
ret[0][0]=3,ret[0][1]=3,
ret[1][0]=-1,ret[1][1]=2,
ret[2][0]=1,ret[2][1]=1,
ret[3][0]=-3,ret[3][1]=0,
==================
ret[0][0]=6,ret[0][1]=7,
ret[1][0]=0,ret[1][1]=6,
ret[2][0]=2,ret[2][1]=5,
ret[3][0]=-4,ret[3][1]=4,
ret[4][0]=4,ret[4][1]=3,
ret[5][0]=-2,ret[5][1]=2,
ret[6][0]=0,ret[6][1]=1,
ret[7][0]=-6,ret[7][1]=0,
==================
ret[0][0]=10,ret[0][1]=15,
ret[1][0]=2,ret[1][1]=14,
ret[2][0]=4,ret[2][1]=13,
ret[3][0]=-4,ret[3][1]=12,
ret[4][0]=6,ret[4][1]=11,
ret[5][0]=-2,ret[5][1]=10,
ret[6][0]=0,ret[6][1]=9,
ret[7][0]=-8,ret[7][1]=8,
ret[8][0]=8,ret[8][1]=7,
ret[9][0]=0,ret[9][1]=6,
ret[10][0]=2,ret[10][1]=5,
ret[11][0]=-6,ret[11][1]=4,
ret[12][0]=4,ret[12][1]=3,
ret[13][0]=-4,ret[13][1]=2,
ret[14][0]=-2,ret[14][1]=1,
ret[15][0]=-10,ret[15][1]=0,
xu@xu-ThinkPad-X61:~/algorithm$
复制代码
改进:
其实对于用二进制存储符号位,应该把二进制转换为符号位的代码写出来,直观些:
代码如下:
复制代码
int biTofh(int bi,int len){//二进制转化为正负号
int i=0;
while(i
int tmp = 1;
if((bi & (tmp<<(len-i-1))) != 0){//从最左位开始比较,该位是1
printf("+");
}
else{
printf("-");
}
i++;
}
printf("\n");
return 0;
}
int main(){
int input[] = {1,2,3,4,5};
biTofh(20,5);//20的二进制是10100共5位;
return 0;
}
复制代码
输出结果:
xu@xu-ThinkPad-X61:~/algorithm$ ./a.out