求数字子序列和中的最大值

102 阅读1分钟

作业

输入一组整数,求出这组数字子序列和中的最大值,只要求计算出最大子序列的和,不必求出最大值对应的序列。

最大子序列和:整数序列 A1, A2,... An (可能有负数),求 A1 ~ An 的一个子序列 Ai ~ Aj,使得 Ai 到 Aj 的和最大。

例如:序列 0, -3, 6, 8, -20, 21, 8, -9, 10, -1, 3, 6, 5,则最大子序列和为 43。

使用嵌套循环,for(for())

for(int i=1;i<t;i++){
tempSum=0;
for(int j=i;j<t;j++)

每次开头确定,但是结尾遍历一遍 得到不同的子序列和

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
    {
        //定义这个序列
        int t;
        printf("input the arr number:\n");
        scanf("%d",&t);
        int arr[t];
        //初始化
        printf("input the arr:\n");
        for(int i=0;i<t;i++)
        scanf("%d",&arr[i]);

        //存储最大值,初始化为arr[0]
        int max=arr[0];

         // 临时变量,存储子序列之和
        int tempSum = 0;

        //子序列开头分别从每个元素开始
        for(int i=1;i<t;i++){
            tempSum=0;//每次重新循环清0

            //不同结尾的子序列
            for(int j=i;j<t;j++)
            {
                tempSum+=arr[j];
                //判断此时子序列的是否大于max
                if(tempSum > max){
                max = tempSum;
                }
            }
        }

         printf("%d\n", max);

         return 0;

    }

实验截图:

图片.png


改进后的程序

能够显示子序列几到几

在判断tempSum > max循环里面把i,j赋值出来就行,最后求出

// 存储子序列号码
        int s,d;
        
            //不同结尾的子序列
            for(int j=i;j<t;j++)
            {
                tempSum+=arr[j];
                //判断此时子序列的是否大于max
                if(tempSum > max){
                max = tempSum;
                s=i+1;
                d=j+1;
                }

            }

        }

         printf("%d\n", max);
         printf("i=%d,j=%d\n", s,d);
         return 0;
                

这部分修改下就行

实验截图:

图片.png


总体代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
    {
        //定义这个序列
        int t;
        printf("input the arr number:\n");
        scanf("%d",&t);
        int arr[t];
        //初始化
        printf("input the arr:\n");
        for(int i=0;i<t;i++)
        scanf("%d",&arr[i]);

        //存储最大值,初始化为arr[0]
        int max=arr[0];

         // 临时变量,存储子序列之和
        int tempSum = 0;

        // 存储子序列号码
        int s,d;

        //子序列开头分别从每个元素开始
        for(int i=1;i<t;i++){
            tempSum=0;//每次重新循环清0

            //不同结尾的子序列
            for(int j=i;j<t;j++)
            {
                tempSum+=arr[j];
                //判断此时子序列的是否大于max
                if(tempSum > max){
                max = tempSum;
                s=i+1;
                d=j+1;
                }

            }

        }

         printf("%d\n", max);
         printf("i=%d,j=%d\n", s,d);
         return 0;

    }