p = 2^a*3^b*5^c*7^d
求形如上式的第n小的数。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
new Task().solve();
}
}
class Task {
InputReader in = new InputReader(System.in);
PrintWriter out = new PrintWriter(System.out);
class Node implements Comparable<Node> {
long p;
int w;
Node(long p, int w) {
this.p = p;
this.w = w;
}
@Override
public int compareTo(Node o) {
return (p < o.p) ? -1 : ((p == o.p) ? 0 : 1);
}
}
final int N = 5848;
long[] humble = new long[N + 8];
String th(int n) {
String s;
if (n % 10 == 1 && n % 100 != 11)
s = "st";
else if (n % 10 == 2 && n % 100 != 12)
s = "nd";
else if (n % 10 == 3 && n % 100 != 13)
s = "rd";
else
s = "th";
return s;
}
void solve() {
Queue<Node> q = new PriorityQueue<Node>();
q.offer(new Node(1L, 7));
int idx = 0;
while (!q.isEmpty() && idx < N) {
Node u = q.poll();
humble[++idx] = u.p;
switch (u.w) {
case 7:
q.add(new Node(u.p * 7, 7));
case 5:
q.add(new Node(u.p * 5, 5));
case 3:
q.add(new Node(u.p * 3, 3));
case 2:
q.add(new Node(u.p * 2, 2));
}
}
q = null;
int n;
while ((n = in.nextInt()) > 0)
out.println("The " + n + th(n) + " humble number is " + humble[n] + ".") ;
out.flush();
}
}
class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = new StringTokenizer("");
}
private void eat(String s) {
tokenizer = new StringTokenizer(s);
}
public String nextLine() {
try {
return reader.readLine();
} catch (Exception e) {
return null;
}
}
public boolean hasNext() {
while (!tokenizer.hasMoreTokens()) {
String s = nextLine();
if (s == null)
return false;
eat(s);
}
return true;
}
public String next() {
hasNext();
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
public double nextDouble() {
return Double.parseDouble(next());
}
public BigInteger nextBigInteger() {
return new BigInteger(next());
}
}