在C语言中,输⼊n个元素组成的序列S,找出⼀个乘积最⼤的连续⼦序(元素的下标索引 是递增的⼦序列) 。如果这个最⼤的乘积不是正数,输出0(表示⽆解)。 其中, 1<=n<=18,-10<=Si<=10。写出完整代码
时间: 2024-09-14 08:06:47 浏览: 40
算出从n个不同元素中取出m个元素(m≤n)的组合数——C语言代码
在C语言中,解决这个问题可以使用动态规划的方式。我们可以创建两个变量`max_product`和`current_product`,分别存储到目前为止的最大连续子数组乘积和当前连续子数组乘积。当遇到负数时,会将`current_product`重置为1,因为负数乘以负数才会得到较大的绝对值。
以下是完整的C语言代码实现:
```c
#include <stdio.h>
int maxProduct(int arr[], int n) {
if (n == 0) return 0; // 空数组的情况
int max_product = arr[0]; // 初始化最大和最小乘积为第一个元素
int current_product = arr[0];
for (int i = 1; i < n; i++) {
// 当前元素与前一最大相乘
current_product = MAX(current_product * arr[i], arr[i]);
// 更新最大乘积
max_product = MAX(max_product, current_product);
// 当前元素与前一最小相乘
current_product = MIN(current_product * arr[i], arr[i]);
}
return max_product > 0 ? max_product : 0;
}
// 辅助函数,用于返回两个整数的最大值
#define MAX(a, b) ((a) > (b) ? (a) : (b))
// 辅助函数,用于返回两个整数的最小值
#define MIN(a, b) ((a) < (b) ? (a) : (b))
int main() {
int n;
printf("Enter the number of elements: ");
scanf("%d", &n);
int arr[n];
printf("Enter the sequence: ");
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int result = maxProduct(arr, n);
printf("The maximum product is: %d\n", result);
return 0;
}
```
在这个代码中,用户会被提示输入数组的长度和每个元素的值。然后程序计算并输出最大的连续子数组乘积。注意,这里的代码假设了用户输入的是有效的数据范围。在实际应用中,可能需要添加错误检查和边界处理。
阅读全文