Bella_Notte 2022-11-26 19:22 采纳率: 88.9%
浏览 82
已结题

C语言给一个整型数组编号

【问题描述】给一个整型数组中的数按从大到小连续编号,要求相同数字编号相同,编号从1开始,输出编号结果时按照原数组元素的顺序输出。
【输入形式】从控制台输入数据,第一行输入数组元素个数(个数大于等于1,并且小于等于20),第二行输入整型数组元素,各个整数之间以空格分隔。
【输出形式】在屏幕上输出编号结果,各个编号之间用一个空格分隔。
【样例输入】
7
-3 75 51 90 1118 51 -3
【样例输出】5 3 4 2 1 4 5
【样例说明】共输入了7个整数,分别为: - 3 75 51 90 1118 51 - 3,其编号分别为5 3 4 2 1 4 5,其中有两个 - 3和51,
//它们的编号相同。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);//输入7
    int arr[2][21];//第一行记录数组 第二行记录编号
    int temp = 0;//记录最大值的个数
    for (int i = 0; i < n; i++)
    {
        scanf("%d", arr[0][i]);//输入-3 75 51 90 1118 51 -3
    }
    int max = arr[0][0];
    for (int j = 0; j < n-temp; j++)
    {
        for (int i = 0; i < n; i++)
        {
            if (max < arr[0][i])
                max = arr[0][i];//找出最大值
        }
        for (int i = 0; i < n; i++)
        {
            if (arr[0][i] == max)//找出多个最大值
            {
                arr[1][i] = i + 1;//编号
                arr[0][i] = ' ';//将已找过的最大值置空
                temp++;
            }
        }
    }
    for (int i = 0; i < n; i++)
        printf("%d ", arr[1][i]);//打印编号
}

img

请问哪里出错了,怎么修改,非常感谢!!

  • 写回答

2条回答 默认 最新

  • 滴水不穿石 2022-11-26 21:42
    关注

    //仅供参考!谢谢!

    img

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    int intcmp(const void *a, const void *b)
    {
        int *x = (int *)a;
        int *y = (int *)b;
        return *x > *y ? -1 : (*x == *y ? 0 : 1);
    }
    
    int main()
    {
        int n = 0;
        scanf("%d", &n);
        int arr1[2][n];                // 第一行记录数组 第二行记录编号
        int arr2[2][n];
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &arr1[0][i]);    // 输入-3 75 51 90 1118 51 -3
            arr2[0][i] = arr1[0][i];
        }
        
        // 先排序
        qsort(arr2[0], n, sizeof(int), intcmp);
    
        // 编号
        int num = 1, flag = 1;
        // flag是标记
        
        arr2[1][0] = 1;
        // 因为arr2数组已经从大到小排好序列的了,
        // 所以第一个元素肯定排第1号,我们对应在第2行第1个直接编号1
    
        for (int i = 1; i < n; i++)    // 遍历已排序的数组
        {
            for (int j = 0; j < i; j++)    // 遍历已经编有序号的数组
            {
                if (arr2[0][i] == arr2[0][j])
                {
                    // 当前未编号的数据与前面编好序列的所有元素进行一一比较
                    // 如果有相同的元素,则当前要编号的元素跟前面编好号的一样
                    // 也就是把前面已编号的元素编号赋值给当前元素编号
                    arr2[1][i] = arr2[1][j];
                    flag = 0;        // 标记赋值为假
                    break;            // 目前元素已经编上号了,无需再一一比较,跳出此内层循环
                }
            }
            if (flag)                // 对应上面的标记,一真一假
            {
                // 标记的作用是,看前面有没有相同的元素的验证
                // 如果flag为真表示该待编号的元素在已经编好号的元素找不到相同值
                // 此时编号就必须递增1并作为该元素的编号
                arr2[1][i] = ++num;
            }
            flag = 1;                // 重置标记 进入下一轮循环
        }
    
        // 这下面个循环应该很容易理解了吧?
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (arr1[0][i] == arr2[0][j])
                {
                    arr1[1][i] = arr2[1][j];
                }
            }
        }
        
        for (int i = 0; i < n; i++)
            printf("%d ", arr1[1][i]);    // 打印编号
    
        return 0;
    }
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月5日
  • 已采纳回答 11月27日
  • 创建了问题 11月26日

悬赏问题

  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题