一个整形数组中最大值求和问题(3)

新要求:

在“一个整形数组中最大值求和问题(2)”的基础之上,加入了新要求。

将一位数组变成环形数组。

首先在自己看到这道题目的时候,并没有什么思路,然后老师一点一点的旁敲侧击,自己又在纸上动手画了画,最后自己实现了这个项目。值得说明的一点是,自己虽然能够实现,但是当与同学们上台分享时,并没有很好的表达出自己的意思,一方面,自己的语言表达能力还很欠缺,在日后的学习生活中要有意识地去改善这一方面。另一方面,自己地逻辑思维不是很清晰,正如主任所说的那样“这只是一个小小地项目都没能很好的表达出自己,那上百行地大项目,更说不出来,也做不出来了。”自己地逻辑思维能力,也要逐步提高。

设计思想:

环形数组,则程序需要在源程序的基础之上,加入实现最后一个数加开头数地想法,即实现n->(n-1)的计算。

首先在原代码基础之上,加入变量a(用来表示数组的长度,由于数组从0开始表示,故赋初值-1),然后当数组遍历完成一次之后,将已有的sum值与(sum+c[0])、a与数组长度n两两进行比较,两个条件都满足时,才执行,将已有的sum值接着从头开始相加的代码,且每执行一次,均需判断a与数组长度的关系。一但a大于等于数组长度n,则跳出循环,此时的f为子数组和的最大值。

实验截图:

源代码:

import java.util.Scanner;

public class sum02 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数组的长度为:");
        int n=sc.nextInt();
        int[] c = new int[n];
        System.out.println("请输入"+n+"个整数");
        for(int i=0;i<n;i++)
        {
            c[i] = (int) sc.nextLong();
        }
        
        int a=-1;//a值用来表示子数组的长度
        int f=0;//定义整形变量f,为子数组最大值
        int sum=0;//定义整形变量sum,为子数组求和
        for(int i=0;i<n;i++)
        {
            sum = sum+c[i];
            if(sum < 0)
            {
                sum=0;
            }
            if(sum > f)
            {
                f = sum;
            }
            a=a+1;
        }
        
        //System.out.println(a);
        if( a<n && (f+c[0])>f) {
            for(int i=0;i<n;i++)
            {
                sum = sum+c[i];
                if(sum < 0)
                {
                    sum=0;
                }
                if(sum > f)
                {
                    f = sum;
                }
                a=a+1;
                if(a >= n) {
                    break;
                }
            }
        }
        
        if(sum == 0)
        {
            for(int i=0;i<n;i++)
            {
                if(i == 0)
                {
                    f = c[i];
                }
                if(f < c[i])
                {
                    f = c[i];
                }
            }
        }
        
        System.out.println("该数组的子数组之和的最大值为:"+f);

    }

}
原文地址:https://www.cnblogs.com/Qi77/p/10596235.html