toj 2807 Number Sort
Time Limit: 10.0 Seconds Memory Limit: 65536K
Total Runs: 469 Accepted Runs: 160
Given you N positive integers, your job is to output these N numbers in the ascending order in every digit (if two numbers in some digit are the same, you should output the smaller one first). For example, there are five numbers 1 11 111 1111 11111. You should output five lines as sample output. If a number doesn't have the ith digit, you can consider its ith digit zero.
Input
The input contains several test cases. Each case contains two lines. The first line contains a positive integer N (N ≤ 1000), indicating the length of the sequence. The second line gives N numbers (each number will not exceed 2147483647). If N = 0 it signals the end of the input and isn't considered to be processed.Output
Each case contains several lines. The first line is indicated as sample output. The i + 1 line contains these N numbers in ascending order in the ith digit.Sample Input
5 1 11 111 1111 11111 7 19 28 37 46 55 55 45 0
Sample Output
Case 1: 1 11 111 1111 11111 1 11 111 1111 11111 1 11 111 1111 11111 1 11 111 1111 11111 1 11 111 1111 11111 Case 2: 45 55 55 46 37 28 19 19 28 37 45 46 55 55
Problem Setter: mmatch@TJU
Source: TJU Programming Contest 2007 Preliminary
//
#include <iostream>
#include <algorithm>
#include <cmath>
#define MAX 1002
using namespace std;
int data[MAX],ddd[MAX];
struct node
{
int num;
int dd;
int da;
}s[MAX];
bool comp(node a,node b)
{
if(a.dd!=b.dd)
return a.dd<b.dd;
else
return a.da<b.da;
}
int n;
int main()
{
int i,MM,j,zzz=1,k;
while(scanf("%d",&n)!=EOF && n)
{
MM=-1;
for(i=0;i<n;i++)
{
scanf("%d",&data[i]);
ddd[i]=data[i];
if(data[i]>MM)
MM=data[i];
}
int nn=0;
while(MM!=0)
{
MM=MM/10;
nn++;
}
int cs=10;
printf("Case %d:\n",zzz++);
for(i=0;i<nn;i++)
{
for(j=0;j<n;j++)
{
s[j].num=j;
s[j].da=data[j];
s[j].dd=ddd[j]%cs;
ddd[j]=ddd[j]/10;
}
sort(s,s+n,comp);
printf("%d",data[s[0].num]);
for(k=1;k<n;k++)
{
printf(" %d",data[s[k].num]);
}
printf("\n");
}
}
return 0;
}
#include <algorithm>
#include <cmath>
#define MAX 1002
using namespace std;
int data[MAX],ddd[MAX];
struct node
{
int num;
int dd;
int da;
}s[MAX];
bool comp(node a,node b)
{
if(a.dd!=b.dd)
return a.dd<b.dd;
else
return a.da<b.da;
}
int n;
int main()
{
int i,MM,j,zzz=1,k;
while(scanf("%d",&n)!=EOF && n)
{
MM=-1;
for(i=0;i<n;i++)
{
scanf("%d",&data[i]);
ddd[i]=data[i];
if(data[i]>MM)
MM=data[i];
}
int nn=0;
while(MM!=0)
{
MM=MM/10;
nn++;
}
int cs=10;
printf("Case %d:\n",zzz++);
for(i=0;i<nn;i++)
{
for(j=0;j<n;j++)
{
s[j].num=j;
s[j].da=data[j];
s[j].dd=ddd[j]%cs;
ddd[j]=ddd[j]/10;
}
sort(s,s+n,comp);
printf("%d",data[s[0].num]);
for(k=1;k<n;k++)
{
printf(" %d",data[s[k].num]);
}
printf("\n");
}
}
return 0;
}