小计算器



标题:填字母游戏


小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说:
“我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了”。


K大师在纸上画了一行n个格子,要小明和他交替往其中填入字母。


并且:


1. 轮到某人填的时候,只能在某个空格中填入L或O
2. 谁先让字母组成了“LOL”的字样,谁获胜。
3. 如果所有格子都填满了,仍无法组成LOL,则平局。


小明试验了几次都输了,他很惭愧,希望你能用计算机帮他解开这个谜。


本题的输入格式为:
第一行,数字n(n<10),表示下面有n个初始局面。
接下来,n行,每行一个串,表示开始的局面。
  比如:“******”, 表示有6个空格。
  “L****”,   表示左边是一个字母L,它的右边是4个空格。


要求输出n个数字,表示对每个局面,如果小明先填,当K大师总是用最强着法的时候,小明的最好结果。
1 表示能赢
-1 表示必输
0 表示可以逼平




例如,
输入:
4
***
L**L
L**L***L
L*****L


则程序应该输出:
0
-1
1
1


资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。


package Main;
/**
 * 这题就是比较麻烦
 * 四则运算可以把运算的数转成十进制的String,再用BigInteger来计算
 * 然后就是十进制转成n进制,n进制转成十进制
 * 还有就是计算a^b,用了快速幂可以加速
 */
import java.math.BigInteger;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		//-----------startTime
//			Long start = System.currentTimeMillis();
		//
		int t = in.nextInt();
		String cur = "";
		Long num = 0L;
		int jin = 10;//默认是10进制
		while (t-- != 0) {
			String a = in.next();
			if (a.equals("CLEAR")) {
				cur = "";
			} else if (a.equals("EQUAL")) {
				System.out.println(cur);
			} else if (a.equals("CHANGE")) {
				int k = in.nextInt();
				jin = k;
				cur = ten_changeTo_N(num, k);
//					System.out.println(cur);
			} else if (a.equals("NUM")) {
				Long tmp = in.nextLong();
				num = tmp;
				cur = String.valueOf(tmp);
			} //运算
			else if (a.equals("ADD")) {
				String ctmp = N_changeTo_TEN(cur, jin);
				String b = in.next();//"NUM"
				String addb = in.next();//jin 进制的数
				addb = N_changeTo_TEN(addb, jin);
//					System.out.println(addb);
				cur = add(ctmp, addb);
				//再转成jin进制的数
				num = Long.valueOf(cur);//转成Long值
				cur = ten_changeTo_N(num, jin);
				t--;
			} else if (a.equals("SUB")) {
				String ctmp = N_changeTo_TEN(cur, jin);
				String b = in.next();//"NUM"
				String subb = in.next();//jin 进制的数
				subb = N_changeTo_TEN(subb, jin);
				cur = sub(ctmp, subb);
				//再转成jin进制的数
				num = Long.valueOf(cur);//转成Long值
				cur = ten_changeTo_N(num, jin);
				t--;
			} else if (a.equals("MUL")) {
				String ctmp = N_changeTo_TEN(cur, jin);
				String b = in.next();//"NUM"
				String mulb = in.next();//jin 进制的数
				mulb = N_changeTo_TEN(mulb, jin);
				cur = sub(ctmp, mulb);
				//再转成jin进制的数
				num = Long.valueOf(cur);//转成Long值
				cur = ten_changeTo_N(num, jin);
				t--;
			} else if (a.equals("DIV")) {
				String ctmp = N_changeTo_TEN(cur, jin);
				String b = in.next();//"NUM"
				String divb = in.next();//jin 进制的数
				divb = N_changeTo_TEN(divb, jin);
				cur = sub(ctmp, divb);
				//再转成jin进制的数
				num = Long.valueOf(cur);//转成Long值
				cur = ten_changeTo_N(num, jin);
				t--;
			} else if (a.equals("MOD")) {
				String ctmp = N_changeTo_TEN(cur, jin);
				String b = in.next();//"NUM"
				String modb = in.next();//jin 进制的数
				modb = N_changeTo_TEN(modb, jin);
				cur = sub(ctmp, modb);
				//再转成jin进制的数
				num = Long.valueOf(cur);//转成Long值
				cur = ten_changeTo_N(num, jin);
				t--;
			}
		}
		
		//--------endTime
//			Long end = System.currentTimeMillis();
		//The all execute time
//			System.out.println(end - start);
	}
	
	//四则运算
	private static String add(String ctmp, String addb) {
		BigInteger a = new BigInteger(ctmp);
		BigInteger b = new BigInteger(addb);
		return String.valueOf(a.add(b));
	}
	private static String sub(String ctmp, String addb) {
		BigInteger a = new BigInteger(ctmp);
		BigInteger b = new BigInteger(addb);
		return String.valueOf(a.subtract(b));
	}
	private static String mul(String ctmp, String addb) {
		BigInteger a = new BigInteger(ctmp);
		BigInteger b = new BigInteger(addb);
		return String.valueOf(a.multiply(b));
	}
	private static String div(String ctmp, String addb) {
		BigInteger a = new BigInteger(ctmp);
		BigInteger b = new BigInteger(addb);
		return String.valueOf(a.divide(b));
	}
	private static String mod(String ctmp, String addb) {
		BigInteger a = new BigInteger(ctmp);
		BigInteger b = new BigInteger(addb);
		return String.valueOf(a.mod(b));
	}

	private static String ten_changeTo_N(Long a, int jin) {
		String s = "", result = "";
		if (jin <= 10) {
			while (a > 0) {
				Long k = a%jin;
				s = s + (char)(k + '0');
				a = a/jin;
			}
			for (int i = 0; i < s.length(); i++) {
				result += s.charAt(s.length() - i - 1);
			}
		} else {
			while (a > 0) {
				Long k = a%jin;
				if (k >= 10) {
					k -= 10;
					s = s + (char)('A' + k);
				} else {
					s = s + (char)(k + '0');
				}
				a = a/jin;
			}
			for (int i = 0; i < s.length(); i++) {
				result += s.charAt(s.length() - i - 1);
			}
		}
		return result;
	}
	private static String N_changeTo_TEN(String n, int jin) {
		Long sum = 0L;
		for (int i = 0; i < n.length(); i++) {
			char ch = n.charAt(n.length() - 1 - i);
			if (ch >= '0' && ch <= '9') {
				Long a = (long)(ch - '0');
				sum += a*fast_mod((long) jin, i);
			} else {
				Long a = (long) (ch - 'A' + 10);
				sum += a*fast_mod((long) jin, i);
			}
			
		}
		return String.valueOf(sum).toString();
	}
	//快速幂计算a^b;
	public static Long fast_mod(Long a, int b) {
		Long ans = 1L;
		Long base = a;
		while (b > 0) {
			if (b%2 != 0) {
				ans = ans*base;
			}
			base = base*base;
			b >>= 1;
		}
		return ans;
	}
	
	private static void test() {
		BigInteger a = new BigInteger("2");
		BigInteger time = new BigInteger("0");
		BigInteger end = new BigInteger("63");
		do {
			if (time.equals(end)) break;
			a = a.multiply(new BigInteger("2"));
			time = time.add(new BigInteger("1"));
		} while (true);
		System.out.println(a);
	}
}

注意:主类的名字必须是:Main,否则按无效代码处理。

猜你喜欢

转载自blog.csdn.net/qq_34649947/article/details/80212328