C语言 一维数组 随机产生二十个3位随机整数(含负数),要求一奇一偶,正负相间,要求产生时就将他们从大到小排完序,然后将绝对值相等的那两个数删除,最后输出 1.用选择排序,或插入排序,各一种方法,另加改进点,制作不易,感谢,代码如下
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int a[20], i, j, temp;
srand(time(NULL)); // 设置随机数种子
// (随机生成20个3位整数,要求一奇一偶,正负相间)
接下来,我们需要保证生成的数一奇一偶、正负相间。为了实现这个功能,我们使用一个do-while循环来生成随机数,并通过判断奇偶性和正负性来决定是否需要重新生成。具体来说,如果i是偶数,则要求生成的数必须为偶数,否则要重新生成;如果i是奇数,则要求生成的数必须为奇数,否则要重新生成;另外,如果当前生成的数与前一个数符号相同,则将其取反,以保证正负相间。
for (i = 0; i < 20; i++) {
do {
a[i] = rand() % 1000 * (rand() % 2 ? 1 : -1); // 生成随机数
} while ((i % 2 == 0 && a[i] % 2 != 0) || (i % 2 == 1 && a[i] % 2 != 1)); // 判断奇偶性
if (i > 0 && a[i] * a[i-1] > 0) a[i] *= -1; // 判断正负性
}(这段代码的作用是随机生成20个3位整数,要求这些数一奇一偶、正负相间)
最后,我们来解释一下为什么这里有一个判断语句if (i > 0 && a[i] * a[i-1] > 0) a[i] *= -1;。这个判断语句的作用是保证当前生成的数与前一个数符号不相同,即正负相间。具体来说,如果当前生成的数与前一个数符号相同(即它们的乘积为正数),则将当前数取反,以保证正负相间。如果i=0,即当前是第一个数,则没有前一个数,这个判断语句就不会执行。
// 选择排序,从大到小排序
for (i = 0; i < 19; i++) {
for (j = i + 1; j < 20; j++) {
if (a[i] < a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
// 删除绝对值相等的两个数
for (i = 0; i < 19; i++) {
if (abs(a[i]) == abs(a[i+1])) {
for (j = i+1; j < 19; j++) {
a[j] = a[j+1];
}
a[19] = 0;
break;}
这里循环的范围是从0到18,因为我们要比较的是相邻两个数之间的绝对值是否相等,而最后一个数没有下一个数可以比较,所以只需要循环到倒数第二个数。
如果删除的不止一对绝对值相等的数,这段代码就只能删除其中的一对,因为在删除一对之后数组的长度减小了1,如果还有绝对值相等的数,它们的下标也会相应地变化。如果要删除所有的绝对值相等的数,可以使用一个while循环来多次执行这段代码,直到没有绝对值为止
// 输出结果
for (i = 0; i < 20; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
还有一种方法,是一样的
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int a[20], i, j, temp;
srand(time(NULL)); // 设置随机数种子
// 随机生成20个3位整数,要求一奇一偶,正负相间
for (i = 0; i < 20; i++) {
do {
a[i] = rand() % 1000 * (rand() % 2 ? 1 : -1); // 生成随机数
} while ((i % 2 == 0 && a[i] % 2 != 0) || (i % 2 == 1 && a[i] % 2 != 1)); // 判断奇偶性
if (i > 0 && a[i] * a[i-1] > 0) a[i] *= -1; // 判断正负性
}
// 插入排序,从大到小排序
for (i = 1; i < 20; i++) {
temp = a[i];
for (j = i-1; j >= 0 && a[j] < temp; j--) {
a[j+1] = a[j];
}
a[j+1] = temp;
}
// 删除绝对值相等的两个数
for (i = 0; i < 19; i++) {
if (abs(a[i]) == abs(a[i+1])) {
for (j = i+1; j < 19; j++) {
a[j] = a[j+1];
}
a[19] = 0;
break;
}
}
// 输出结果
for (i = 0; i < 20; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
大家可以用别的方法写,这种写法也是我自己不断改良后的,有不足请点出,感谢