【问题描述】给一个整型数组中的数按从大到小连续编号,要求相同数字编号相同,编号从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
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]);//打印编号
}
请问哪里出错了,怎么修改,非常感谢!!
//仅供参考!谢谢!
#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;
}