[课程相关]homework-01

1)先写我的 github 的介绍:

github 的域名:http://www.github.com/jeanhwea

登入 github 大概是下面的视图:

2)我选择的教材: code complete2

最大子数组之和

这个问题想明白了大致还是比较简单的,我想的是一个O(n) 的算法,大致思路就是,首先将前面的元素相加,并把和记为b,如果该和小于0,那么就把前面的相加之和丢弃掉,从新从下一个元素相加,(明显,如果前面的元素之和小于0,那么最大的子数组之和不应该包含这些元素,因为它们对子数组之和有不利的影响)

每次扫描过一个元素,就把当前的子数组之和和一个当前保存的值做比较,(这个值可以初始化为0),如果当前数组之和大于这个保存值,那么就把这个当前数组之和的值保存下来,这样,扫描过一遍数组之后,就得到了当前数组的最大子数组之和的值。

int maxSum(int* a, int n)    
{    
    int sum=0;     int b=0; 
    int i=0;
    for(i=0; i<n; i++)    
    {    
        if(b<0)           //...     
            b=a[i];    
        else    
            b+=a[i];    
        if(sum<b)    
            sum=b;    
    }    
    return sum;    
} 

把所求的数组放入这个函数中,并输入数组的长度你n,就可以返回数组的最大长度。

需要注意的一点是,这个算法对于数组元素全是负数的情况之下会返回0,也可以扫描整个数组,返回最大的负数,但是返回0,就意味着子数组选择了0个,也是合理的

主函数

int main(int argc, char* argv[])
{
    FILE *in;

    int i=0,j=0,k=0,z=0,t=0,temp[200]={0};
    int n,m,d[200][200],sum=0,s=0;
    int test[10]={1,2,3,-1,2,3,1};
    char path[50];
    
    j=strlen(argv[0]);
    for(;j>=0;j--)
    {
        if((int)argv[0][j]==92)
            break;
    }
    for(i=0;i<=j;i++)
        path[i]=argv[0][i];
    path[i]='';
    
    strcat(path,argv[argc-1]);
//    printf("%s
",path);
    in=fopen(path,"r");
    fscanf(in,"%d",&n);
    fscanf(in,"%d",&m);
    if(argc>4)
    {printf("too many arguments");exit(0);}
        
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            fscanf(in,"%d",&d[i][j]);
        }
    }
  //if(strcmp(argv[1],"-h"))
 // {
     sum=maxSum(d[0],m);
  //}

   printf("%d
",sum);

    for(;;);    
}

main函数前面处理的命令行参数的问题,以便可以合理打开test.txt,另外,我这里申请了一个200*200的二维数组,是为了实现下一次作业,这次作业只要求实现一维,那么我就改写一下输入,让输入只有一行即可。

一些测试用例

命令行运行:

结果

可见输出了正确的结果

另附几组测试用例

结果

可见本程序较好的解决了这一问题。

至于二维的问题相关,将会在下一次博客中更新

原文地址:https://www.cnblogs.com/cqd123123/p/3329911.html