巧用二维数组进行编号排序以及创建新数组排序编号和一个杨辉三角的实现


一、对数组 A 中的N( 0 <N<100)个整数从小到大进行连续编
      号,输出各个元素的编号。要求不能改变数组A中元素的
      顺序,且相同的整数要具有相同的编号。
       例如:数组是: A=(5,3,4,7,3,5,6)
      则输出为:(3,1,2,5,1,3,4)

这里我们可以巧妙运用二维数组,用其第一行储存元素,第二行储存编号,到时候打印出来即可!

下面展示一下我的代码,仅供参考!!!

#include <stdio.h>
main()
{
    int i, j, k, n, m = 1, r = 1, a[2][100] = { 0 };
    printf("Please enter n:");       //确定数组大小
    scanf("%d", &n);
    for (i = 0; i < n; i++)          //输入数据
    {
        printf("a[%d]= ", i);
        scanf("%d", &a[0][i]);
    }
    
    while (m <= n)           // 限定循环条件,用m来统计已编过号的数组元素
    {
        for (i = 0; i < n; i++)
        {
            if (a[1][i] == 0)          //这里进行挑选没有编过号的元素
            {
                break;           //挑选到则跳出循环
            }
        }
        k = i;        //用k来暂时储存i,便于后面进行比较
        for (j = i; j < n; j++)
        {
            if (a[1][j] == 0 && a[0][j] < a[0][k])   //判断此次循环是否存在比a[0][i]小的元素
            {
                k = j;         //如果存在则令k=j以便后续对这个元素进行编号
            }
        }
            a[1][k] = r++;     //此处进行编号
        
        m++;          //编一次号m加1一次
        for (j = 0; j < n; j++)       //这里的循环用于判断是否有相等的元素
        {
            if (a[1][j] == 0 && a[0][j] == a[0][k])
            {
                a[1][j] = a[1][k];    //如果存在相等的元素则令其编号相等
                m++;             //因为存在相等m在进行加1减少循环次数
            }
        }
    }
    for (i = 0; i < n; i++)
        printf("\na[%d]=%3d  其编号为%d\n", i, a[0][i], a[1][i]);
}

具体思路;首先我们创建一个二维数组,行为2,至于列我们就取个100好了,到最后我们取定数组长度不要超过100就好了,然后我们输入数据,再进行选出没有编号(注意如果数组中没有输入值进去时数组默认储存一个0进去,所以没有编号过的元素其对应的第二行数组元素便为0)元素进行比较,如果有比它小的元素就对该元素编号,如果没有便对它自己进行编号,比如上面图中的a[0][0]下方的比编号即a[1][0]的值为0则对其进行比较其他队员下方编号也为0的元素,编号的具体过程参考上面的代码!下面进入第二个阶段!


二、求一个二维数组中每行的最大值和每行的和。

#include <stdio.h>
main()
{
    int a[5][5], b[5], c[5], i, j, k, s = 0;  //创建一个b[5]来储存最大值,c[5]来储存每行的和
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            a[i][j] = rand(1) %50+10;     //这里随机储存数字,由rand实现
        }
    }

    for (i = 0; i < 5; i++)
    {
        k = a[i][0];      // 这里取每行的第一个元素进行开始比较
        s=0;              //这里用于初始化s的值
        for (j = 0; j < 5; j++)       //进行比较
        {
            if (k < a[i][j])
            {
                k = a[i][j];
            }
            s = s + a[i][j];   //将每行的元素相加用s暂时储存
        }
        b[i] = k;             //找到最大值依次放入b[5]中
       
        c[i]=s;              // 最终将s储存进c[5]中
    }
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
           
        {
            printf("%2d   ", a[i][j]);
        }
        printf("其最大值为:%d  这一行元素的和为:%5d\n", b[i], c[i]);
        printf("\n");
    }
}

大家可以看一下运行结果: 具体思路:我们照常创建一个二维数组,然后我们再创建一个b[ ]数组和c[ ]数组,这里我们测试选择数据小一点,就创建一个a[5][5]和b[5]及c[5],代码中也详细解释了b[5]用来储存每行的最大值,c[5]用来储存每行的元素和!最后参考代码进行运算即可!!!


三、杨辉三角形
        杨辉三角是将若干数字按照一定规律排列成三角形的数表,每一行最外侧的数字都是1,中间的数字等于它肩膀上的两数之和。杨辉三角每一行的数刚好对应二项式展开后的系数,实际上是一张二项式系数表。杨辉三角在1261年杨辉所著的《详解九章算法》已经出现,最初被称为“开方作法本源图”,后人简称为“杨辉三角”。杨辉三角有许多重要的性质,在数列求和等方面具有重要应用。

 

#include  <stdio.h>
#define N 10
main()
{
    static int a[N][N];
    int i, j, k;
    /***********FOUND***********/
    for (i = 0; i < N; i++)
    {
        /***********FOUND***********/
        for (k = 0; k < 3*N - 3* i; k++)
            printf(" ");
        for (j = 0; j <= i; j++)
        {
            if (j == 0 || j == i)
                a[i][j] = 1;
            else
                a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
            printf(" ");
            printf("%-5d", a[i][j]);
        }
        printf("\n");
    }
}

看了上面代码相信各位也会怎么敲了,需要注意的是当行数N变大时需要修改一下距离,不然很可能会是数据很集中不美观!


今天到此结束,期待各位的观看和支持。您的支持是我更新的动力!!!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值