作业
输入一组整数,求出这组数字子序列和中的最大值,只要求计算出最大子序列的和,不必求出最大值对应的序列。
最大子序列和:整数序列 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;
}
实验截图:
改进后的程序
能够显示子序列几到几
在判断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;
这部分修改下就行
实验截图:
总体代码:
#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;
}