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 i th 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 ;
}