修改后代码如下:
#include <stdio.h>#include <stdlib.h>
#include <math.h>
//char in_f[]="chain.dat",out_f[]="chain.out"
int a[2001],b[2001]
int an,n
void init(){
//FILE *f
//f=fopen(in_f,"r")
//fscanf(f,"%d",&an)
scanf ("%d", &an)
//fclose(f)
}
void trial(int m){
int i,j
if(m>n) return
if(a[m-1]==an){
n=m-1
for(j=1 j<=n j++) b[j]=a[j]
return
}
for(i=m-1 i>=1 i--)
if(a[i]+a[m-1]<=an){
a[m]=a[i]+a[m-1]
if((n-m-1>=10) || (a[m]*(2 <<(n-m-1)))>=an)
trial(m+1)
}
}
void pmain(){
int i
//FILE *f
a[1]=1
n=2*(int)(sqrt(an)+0.5)+1
trial(2)
//f=fopen(out_f,"w")
//fprintf(f,"%d\n",n)
printf ("%d\n", n)
for(i=1 i<=n i++)
printf ("%d ", b[i])
printf ("\n")
//fprintf(f,"%d ",b[i])
//fprintf(f,"\n")
//fclose(f)
}
int main(){
init()
pmain()
return 0
}
#include<stdio.h>#include<stdlib.h>
int saving,*save
void check(int i,int first,int N,int total,int *num)
{ int j,k
save[saving]=i
saving++
for(j=i+1j<Nj++)
{ check(j,first+num[j],N,total,num)//递归check
//若经过排序这里如果first+num[j]>total的话就可以return了
if(first+num[j]==total)
{ for(k=0k<savingk++)
printf("%d ",num[save[k]])
printf("%d\n",num[j])
}
}
saving--
}
void main()
{int N,total,i=0,j,temp
int *num
saving=0
printf("input N:")
scanf("%d",&N)
num=(int *)malloc(sizeof(int)*(N+1))
save=(int *)malloc(sizeof(int)*(N+1))
printf("input %d num:",N)
for(i=0i<Ni++)
scanf("%d",&num[i])//对这N个数排序可提高效率^^
printf("input total:")
scanf("%d",&total)
for(i=0i<Ni++)//算法从这里正式开始!!!
check(i,num[i],N,total,num)
}
printf()也是一个函数,而且它需要的第一个参数是个字符指针,也就是说,printf()函数的的第一个参数可以是个字符指针,而不一定非要是一个字符串常量。知道这一点后就可以理解这个调用了:
它等价于:
char *p=(x%2)?("**%d"):("##%d\n")
printf(p,x)
明白了吗,如果不明白,那么进一步等价于(虽然语法上可能不怎么正确,但是这里要说明的是它的算法):
char *p
if (x%2!=0) p="**%d"
else p="##%d\n"
printf(p,x)