c语言数组存放10个随机数,求c语言高手编一程序 将数组a[10]中正数与负数分出并分别存到b[N]、...

题目中有些需要考虑的问题:

1。 没有给出数组a[10]数据源, 要我们创造出来么? 随机输入还是用户输入? 另外a是什么类型的数组, 整数?单精度双精度浮点?甚至可能是字符串?

2。 两个整数数组b和c需要静态数组还是动态的?因为如果是静态的, 那么最后会出现一些垃圾值, 如果是初始化过的, 那么会多出一些0。

3。 如果数组a是int/double/float类型数组的其中一个, 那么数组中出现0(0。000000)怎么办?

代码如下: 假设整型数组a[10]所有数字是随机产生, b和c数组大小固定和数组a长度相同。

#include

#include /*srand和rand函数都在这个头文件内*/

#include /*time在这个头文件内--只是为了生成逼真的随机数效果*/

#define ARRAYSIZE 10

void Generate_a10(int *ar);

void Separate(int *ar, int *br, int *cr);

void Print(int *br, int *cr);

int main(void)

{

int a[ARRAYSIZE], b[ARRAYSIZE] = {0}, c[ARRAYSIZE] = {0};

srand(time(NULL)); /*设置随机种子*/

Generate_a10(a); /*产生10个随机数到源数组a*/

Separate(a, b, c); /*将正负数分割到数组b和c*/

//Print(b, c); /*输出到屏幕, 因为不确定题目是否要输出, 故屏蔽。

*/

return 0;

}

void Generate_a10(int *ar)

{

int i;

for(i = 0; i 0) { /*整形数组b存储正整数*/

*(br + j) = *(ar + i);

j++;

}

else if(*(ar + i) < 0) { /*c存储负整数*/

*(cr + k) = *(ar + i);

k++;

}

}

}

void Print(int *br, int *cr)

{

int i;

puts("b[N]:");

for(i = 0; i < ARRAYSIZE; i++) {

printf("%d ", *(br + i));

}

puts("\nc[N]:");

for(i = 0; i < ARRAYSIZE; i++) {

printf("%d ", *(cr + i));

}

putchar('\n');

}

全部

这个问题可以使用Kadane算法来解决,这是一个用来寻找包含负数数组的最大子数组和的算法。基本思想是遍历数组,在遍历的同时,使用两个变量:当前子数组的最大和`max_current`和目前为止最大的子数组和`max_global`。`max_current`会在遇到负和时重置为0,因为任何负和的子数组都不可能是最大和的子数组。算法的步骤如下: 1. 初始化`max_current`和`max_global`为数组的第一个元素。 2. 从第二个元素开始遍历数组。 3. 对于每个元素,如果`max_current`是负数,则将其重置为当前元素,因为当前元素会比`max_current`加上一个负数更大。 4. 更新`max_current`为`max_current`与当前元素之和。 5. 如果`max_current`大于`max_global`,则更新`max_global`为`max_current`。 6. 继续遍历直到数组结束。 7. 返回`max_global`作为最大子数组和。 以下是C语言实现的示例代码: ```c #include <stdio.h> int maxSubArraySum(int a[], int size) { int max_current = a[0], max_global = a[0]; for (int i = 1; i < size; i++) { max_current = (max_current > 0) ? (max_current + a[i]) : a[i]; if (max_current > max_global) max_global = max_current; } return max_global; } int main() { int arr[] = {-2, -3, 4, -1, -2, 1, 5, -3}; int n = sizeof(arr) / sizeof(arr[0]); int max_sum = maxSubArraySum(arr, n); printf("最大子数组和为: %d\n", max_sum); return 0; } ``` 这段代码会输出数组所有子数组和的最大值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值