UVa10669 - Three powers

Consider the set of all non-negative integer powers of 3.

S = { 1, 3, 9, 27, 81, ... }

Consider the sequence of all subsets of S ordered by thevalue of the sum of their elements. The question is simple: find the setat the n-th position in the sequence and print it in increasingorder of its elements.

Each line of input contains a number n, which is a positiveinteger with no more than 19 digits. The last line of input contains0 and it should not be processed.

For each line of input, output a single line displaying then-th set as described above, in the format used in the sampleoutput.

Sample input

1
7
14
783
1125900981634049
0

Output for sample input

{ }
{ 3, 9 }
{ 1, 9, 27 }
{ 3, 9, 27, 6561, 19683 }
{ 59049, 3486784401, 205891132094649, 717897987691852588770249 }
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.math.BigInteger;

public class Main implements Runnable{
	private static final boolean DEBUG = false;
	private BufferedReader cin;
	private PrintWriter cout;
	private StreamTokenizer tokenizer;
	private BigInteger n;
	
	private void init() 
	{
		try {
			if (DEBUG) {
				cin = new BufferedReader(new InputStreamReader(
						new FileInputStream("d:\\OJ\\uva_in.txt")));
			} else {
				cin = new BufferedReader(new InputStreamReader(System.in));
			}

			tokenizer = new StreamTokenizer(cin);
			tokenizer.resetSyntax();
			tokenizer.wordChars('a', 'z');
			tokenizer.wordChars('A', 'Z');
			tokenizer.wordChars('0', '9');
			tokenizer.wordChars(128 + 32, 255);
			tokenizer.whitespaceChars(0, ' ');
			tokenizer.quoteChar('\'');
			tokenizer.quoteChar('"');
			cout = new PrintWriter(new OutputStreamWriter(System.out));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private String next() 
	{
		try {
			 tokenizer.nextToken(); 
			 if (tokenizer.ttype == StreamTokenizer.TT_EOF) return null; 
			 else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) { 
			 	return String.valueOf((int)tokenizer.nval); 
			} else return tokenizer.sval;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	private boolean input() 
	{
		n = new BigInteger(next());
		
		if (n.compareTo(BigInteger.ZERO) == 0) return false;
		
		return true;
	}
	
	private void solve() 
	{
		n = n.subtract(BigInteger.ONE);
		
		ArrayList<BigInteger> ans = new ArrayList<BigInteger>();
		
		int bitlen = n.bitLength();
		
		for (int i = 0; i < bitlen; i++) {
			if (n.testBit(i)) {
				ans.add(BigInteger.valueOf(3).pow(i));
			}
		}
		if (ans.isEmpty()) {
			cout.println("{ }");
		} else {
			cout.print("{ ");
			for (int i = 0, size = ans.size(); i < size; i++) {
				if (i != 0) cout.print(", ");
				cout.print(ans.get(i));
			}
			cout.println(" }");
		}
		cout.flush();
	}

	public void run()
	{
		init();
		
		while (input()) {
			solve();
		}
		
	}
	
	public static void main(String[] args) 
	{
		new Thread(new Main()).start();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值