1817 - 奇怪的排序
最近,Dr. Kong 新设计一个机器人Bill.这台机器人很聪明,会做许多事情。惟独对自然数的理解与人类不一样,它是从右往左读数.比如,它看到123时,会理解成321.让它比较23与15哪一个大,它说15大。原因是它的大脑会以为是32与51在进行比较.再比如让它比较29与30,它说29大.
给定Bill两个自然数A和B,让它将 [A,B] 区间中的所有数按从小到大排序出来。你会认为它如何排序?
题目输入
第一行: N表示有多少组测试数据. (2<=N<=5 )
接下来有N行,每一行有两个正整数A B表示待排序元素的区间范围. (1<=A<=B<=200000 B-A<=50)
题目输出
对于每一行测试数据,输出一行,为所有排好序的元素,元素之间有一个空格.
输入/输出样例
题目输入
2 8 15 22 39
题目输出
10 8 9 11 12 13 14 15 30 31 22 32 23 33 24 34 25 35 26 36 27 37 28 38 29 39
C语言解答
#include <stdio.h> #include <string.h> #define MAX1 55 int p[MAX1]; int w[MAX1]; int ireverse(int num) //求逆序数 { int rnum=0; while(num) { rnum=rnum*10 + num%10; num/=10; } return rnum; } int main() { int n,m,t; scanf("%d",&n); while(n--) { int a,b; scanf("%d%d",&a,&b); int len; len=b-a+1; p[0]=a; int i,j; for(i=1;i<len;i++) { p[i]=p[i-1]+1; } for(i=0;i<len;i++) { w[i]=ireverse(p[i]); } for(i=0;i<len;i++) {for(j=i+1;j<len;j++) if(w[i]>w[j]) {t=w[i];w[i]=w[j];w[j]=t; m=p[i];p[i]=p[j];p[j]=m;} } for(i=0;i<len;i++) { printf("%d ",p[i]); } printf("\n"); } return 0; }
C++解答
#include <cstdio> #include <cstdlib> int cmp(const void *a, const void *b){ int aa = *(int *)a, bb = *(int *)b; int i = 0, j = 0; while(aa){ i = i * 10 + aa % 10; aa /= 10; } while(bb){ j = j * 10 + bb % 10; bb /= 10; } return i - j; } int main(){ int t, a, b, *vec; scanf("%d", &t); while(t-- && scanf("%d%d", &a, &b)){ int count = b - a + 1; vec = (int *)malloc(sizeof(int) * count); for(int i = 0; i != count; ++i) vec[i] = a + i; qsort(vec, count, sizeof(int), cmp); int ok = 1; for(int i = 0; i != count; ++i) if(ok) printf("%d", vec[i]), ok = 0; else printf(" %d", vec[i]); printf("\n"); free(vec); } return 0; }