#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 第二問的代碼算法
發佈到首頁候選去是想各位園子裏感興趣的大神看看這個求最小正序列和的代碼正確否。謝謝了數組