一、要求:
要求程序必须能处理1000个元素;
每个元素是int32类型,出现子数组之和大于整形表示的范围会出现什么情况?
输入一个整形数组,数组里有正数也有负数;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值,要求时间复杂度为O(n#include"stdafx.h"
#include <stdio.h> #include <stdlib.h> #include <time.h> int MAX(int a, int b)//定义最大值函数 { if (a > b) { return a; } else { return b; } } int main(void) { srand((unsigned)time(NULL)); //本地时间为种子 int n; printf("please enter the number of arrays "); scanf_s("%d", &n);//输入数组的长度n int *a = (int *)malloc(sizeof(int)*n);//定义任意长度的数组int i; for (i = 0; i < n; i++) { a[i] = rand() % 20000-10000;//随机生成数组 printf("%d ", a[i]); } printf(" "); int maxsum=a[0]; int sum = 0; for (i = 0; i < n; ++i) { if (sum < 0) { sum = a[i]; } else { sum += a[i]; } maxsum = MAX(maxsum, sum); } printf("maxsum=%d", maxsum); getchar(); getchar(); return 0; }
出现子数组之和大于整形表示的范围时,计算的最后结果一直为整形范围的最大值即2147478255。
因为要求时间复杂度为O(n),所以采用的是线性算法。
三、程序运行结果:
1、运算结果超出整数表示最大范围
2、数组长度为1000时的运行结果
同组人:林梦颖
2018-10-14