最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

#include "stdio.h"
#include "stdlib.h"
#define random(x) (rand()%x)
void creat_array(int a[],int len,int max);
void print_array(int a[],int n);
void main(){
    printf("please input two numbers as the array's length and the array's max_number: \n");
    int n,max;
    scanf("%d,%d",&n,&max); 
    int a[n];
    void creat_array(int a[],int len,int max){
        //产生一个随机正负数组
        for(int i=0;i<len;i++){
            a[i]=random(max)-max/2;
        }
    } 
    //int a[]={4,-1,5,-2,-1,2,6,-2};
    //int a[]={4,-1,4};
    creat_array(a,n,max); 
    int min_sum_sqe(int a[],int n){
        //求出数组a的子序列的最小正子序列和
        //任何一个子序列和都可表示成两个子序列之差ABCD序列,B序列可以表示成AB序列减去A序列。
        int sum[n];
        int s=0;
        for(int i=0;i<n;i++){
            sum[i]=0;
        }
        for(int i=0;i<n;i++){
            s+=a[i];
            sum[i]+=s;
        }
        printf("产生的数组和是:\n");
        print_array(sum,n);
        int min;
        for(int i=0;i<n;i++){
            if(a[i]>0){
                //因为是求最下正数,必须要保证min>0,不然下面代码中的if判断会失效
                min=a[i];
                printf("min:%d \n",min);
                break; 
            }
        }
        int thismin;
        for(int j=0;j<n;j++){
            thismin=sum[j];
            for(int k=j;k<n-1;k++){
               thismin=sum[k+1]-sum[j];
               if(thismin>0&&thismin<min){
                    min=thismin;
                    printf("%d,%d,%d\n",sum[k],sum[j],min);
               }
            }
        }
        return min;
    }
    int key=min_sum_sqe(a,n);
    printf("最小的正子序列和: %d\n",key);
    printf("产生的随机数组:\n");
    print_array(a,n);
}
    void print_array(int a[],int n){
        //打印随机数组
        
        for(int i=0;i<n;i++){
            ((i+1)%10==0)?printf("%4d \n",a[i]):printf("%4d ,",a[i]);
        }
    }

这是 数据结构与算法分析——C语言描述中看第二章习题2.12 第二问的代码

发布到首页候选去是想各位园子里感兴趣的大神看看这个求最小正序列和的代码正确否。谢谢了

posted @ 2014-05-07 11:23  cc_jony  阅读(449)  评论(0编辑  收藏  举报