近似排序
题目描述:读入一对正整数,将这两个数之间(包括这两个数本身)的所有数按下述特别规则排序后输出,该特别规则是按两数倒过来的值进行比较决定其大小,如30倒过来为3,29倒过来为92,则29大于30。
输入:1行,包含两个用空格隔开的自然数,这两个自然数给出了待排序数的范围,其中l≤第一个数≤第二个数≤999999999,两个数之差不超过100。
输出:输出排序后的数据,每行输出一个数。
样例输入:
22 39
样例输出:
30
31
22
32
23
33
24
34
25
35
26
36
27
37
28
38
29
39
这题吧,我怀疑它是来考函数的,不难,就是函数多,通过这题确实学了好些函数(大年三十晚上在这码代码,哎,辛酸的不说了),现在步入正题。
#include<bits/stdc++.h>
#include<cstring>
#include <cstdlib>
#define N 105
using namespace std;
typedef struct
{
int u,v;
}STU;//建立一个结构体,一个是原数字,另一个是反转以后的数字
int main()
{
STU a[N],h;
int minn,maxn,i,j=0,k,w,m,len,l;
char b[10],c[10],p[N][N],q[N][N];
scanf("%s%s",b,c);
w=atoi(b);//atoi函数,将字符串转为数字
m=atoi(c);
minn=min(w,m);
maxn=max(w,m);
for(i=minn;i<=maxn;i++)
{
j++;
a[j].u=i;
a[j].v=i;
}
for(i=1;i<=j;i++)
{
sprintf(p[i],"%d",a[i].u);//sprintf函数,将数字转换为字符串
len=strlen(p[i]);
for(k=0,l=len-1;l>=0;k++,l--)
{
q[i][k]=p[i][l];
}
q[i][len]='\0';//字符串末尾为\0
a[i].u=atoi(q[i]);
}
for(i=1;i<j;i++)
{
for(k=1;k<j;k++)
{
if(a[k].u>a[k+1].u)
{
h=a[k];
a[k]=a[k+1];//结构体调换位置
a[k+1]=h;
}
}
}
for(i=1;i<=j;i++)
{
printf("%d\n",a[i].v);//输出排序后,反转之前的数字
}
return 0;
}