C语言有趣数列改写

Python014

C语言有趣数列改写,第1张

修改后代码如下:

#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)