POJ2247数论

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());
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值