C语言实现火星数排序

题目描述

哈哈,大家对地球上的排序规则都比较清楚了吧!可是火星上的规则跟地球上的不一样。地球上的十个数字的顺序是{0,1,2,3,4,5,6,7,8,9},火星上的却是{0,8,1,5,2,3,9,4,7,6}。好在火星上基本数字也是十个,也是十进制,因此,很容易推得9<80<88<81<… 请根据火星上的规则对火星数进行从小到大的排序。

输入

第一行为Case,表明接下来有Case组输入数据,每组数据的开头为N,表明该行接下来有N个数,然后是N个火星数中间以一个空格隔开

输出

每组输出只占一行,为N个经过火星排序的数

样例输入

2 3 4
88
12 3
98 46

样例输出

2 3 4
21
12 756
98 46首先找到火星数字对应的映射关系即int b[]数组,创建结构体,每次进while和for用memeset()清空结构体数组,每次赋值结构体数组里面的火星数字,和对应的地球数字,然后对结构体进行排序

#include <stdio.h>
#include <string.h>

struct map
{
int earth ;
int mars ;
}MAP[100];// //火星与地球数字对应关系的结构体
void transform(struct map * p,int *b,int *c,int i);
int main()
{
int b[10]={0,2,4,5,7,3,9,8,1,6}; //映射关系
int c[10],t,n,i,j;
struct map temp ;
scanf("%d",&t);
while(t--)
{
memset(MAP,0,sizeof(MAP));
scanf("%d",&n);
for(i=0;i<n;i++)
{
memset(c,0,sizeof(c));
scanf("%d",&MAP[i].mars);
transform(&MAP[i],b,c,i);
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(MAP[j].earth>MAP[j+1].earth)
{
temp =MAP[j] ;
MAP[j]=MAP[j+1];
MAP[j+1]=temp;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",MAP[i].mars);
}
printf("\n");

}
}
void transform(struct map * p,int *b,int *c,int i)////将火星数字转化为对应的地球数字
{
int ii=0,j,n,r ;
n= p->mars;
r=n;
while(n)
{
c[ii++]=n%10;
n/=10;
}
for(j=ii-1;j>=0;j--)
{
p->earth=p->earth*10+b[c[j]];
}
// printf("火星数%d对应的地球数是:%d\n",r,p->earth);
}