能加些注释吗??
上楼的高手 你的我看不懂啊!我也做了一个!请多指教! #include "stdio.h" #include"ctype.h" #define maxsize 10 int max(int k) //求k位二进制数的最大值,例如:2位最大二进制数11,十进制则是1+2=3。 { int i; int j=1; int sum=1; for(i=k;i-1;i--) { j=j*2; sum=sum+j; } return sum; } void your(int num,int x[],int j)//十进制数变成二进制数,用数组记住每位上的数。 { int mask,i; mask = 1<<(j-1); /*构造1个最高位为1、其余各位为0的整数(屏蔽字)*/ for(i=1; i<=j; i++) { (num&mask) ? x[i-1]=1 : x[i-1]=0; /*输出最高位的值(1/0)*/ num <<= 1; /*将次高位移到最高位上*/ } } //算法就是先确定第一个值的可能最大最小值(通过等差数列) //然后申请两个数组,一个放数值,一个放运算符号, //用二进制中的0和1表示运算符号的加和减,而且通过二进制的递增表示每一种可能 //然后判断
void yours(int num,int len) { int i,m,n,s,sum,you; int x[maxsize]; int y[maxsize]; sum=max(len-1); for(i=(int)((num/len)-(len-1)/2)-1;i<=(int)(num/len+(len-1)/2+1);i++) { for(n=0;n<len-1;n++) y[n]=0; x[0]=i; for(m=0;m<=sum;m++) { your(m,y,(len-1)); for(n=0;n<len-1;n++) { you=0; if(y[n]) x[n+1]=x[n]+1; else x[n+1]=x[n]-1; } for(s=0;s<len;s++) you=you+x[s]; if(you==num) { for(s=0;s<len;s++) printf("%d,",x[s]); printf("\n"); } } } }; void main() { int num; int len; printf("请输入num和len\n"); scanf("%d,%d",&num); scanf("%d,%d",&len); printf("答案是:\n"); yours(num,len); printf("如果不输出那就表示是无答案!!!"); }
[此贴子已经被作者于2005-4-7 19:59:05编辑过]