C语言创新题 多种写法

文章展示了如何使用C语言生成一个包含20个满足特定条件(一奇一偶、正负相间)的随机整数数组,然后使用选择排序和插入排序两种方法从大到小排列数组,并删除绝对值相等的数。代码中包含了对生成规则的详细解释和排序过程。
摘要由CSDN通过智能技术生成

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;
}

 

大家可以用别的方法写,这种写法也是我自己不断改良后的,有不足请点出,感谢

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值