`
wen.owen
  • 浏览: 20305 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

2010网易编程挑战赛——另类的异或的参考解答

    博客分类:
  • Java
阅读更多
号称史上最高奖金的编程大赛于5月29号开赛,可惜那几天我正好有事没能参加,闲暇之余看了他们的赛题,觉得题目出得还是不错的。以下的赛题摘自于http://poj.youdao.com/nanti1/A/

----------------------------------
描述
    对于普通的异或,其实是二进制的无进位的加法
    这里我们定义一种另类的异或A op B, op是一个仅由^组成的字符串,如果op中包含n个^,那么A op B表示A和B之间进行n+1进制的无进位的加法。
    下图展示了3 ^ 5 和 4 ^^ 5的计算过程
输入
    第一行有一个正整数T, 表示下面共有T组测试数据。
    接下来T行,每行有一组测试数据,是由空格隔开的三个部分组成:
    A B C
    A和C是两个十进制整数,B是一个字符串,由n个^组成
    1 <= T <= 100, 0<=A,B<2^30, 1<=n<=1000
输出
    每个测试数据输出一行,包含一个数字,即该数据的结果,用十进制表示。
样例输入

    2
    3 ^ 5
    4 ^^ 5

样例输出

    6
    6
------------------------------------
我的给出的解答源码如下,与大家分享,欢迎其它同学有更好的解答与本人分享:
package com.koober.youdao;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class AnotherXOR {

	/** 
	 * @param a 十进制数据
	 * @param N 待转换的进制
	 * @return 转换后的每位按逆序(也就是从低位到高位)放到list中返回
	 */
	List<Integer> convertToNBased(int a, int N){
		ArrayList<Integer> resultList  = new ArrayList<Integer>();
		while(a >= N){
			resultList.add(a % N);
			a = a / N;
		}
		resultList.add(a);
		return resultList;
	}
	
	/**
	 * 将n进制的数转换回10进制的数
	 * @param srcList n进制数,逆顺放置在List中,即按位从低位到高位放在srcList中
	 * @param N 原进制基数
	 * @return 10进制数
	 */
	int return10(List<Integer> srcList, int N){
		int sum = 0;
		for (int i = 0; i < srcList.size(); i++) {
			sum += srcList.get(i) * Math.pow(N, i);
		}
		
		return Math.round(sum);
	}
	
	/**
	 * 将两个N进制的数进行另类的异或相加
	 * @param N N进制
	 * @return 将相加的结果以10进制返回
	 */
	int addBasedN(List<Integer> a, List<Integer> b, int N){
		if (a.size()>b.size()){
			for (int i=0, n = b.size(); i< n; i++){
				a.set(i, (a.get(i) + b.get(i)) % N);
			}
			return return10(a, N);
		}else{
			for (int i=0, n = a.size(); i< n; i++){
				b.set(i, (a.get(i) + b.get(i)) % N);
			}
			return return10(b, N);
		}
	}
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		final int T = scanner.nextInt();
		int[] a = new int[T];
		int[] b = new int[T];
		String[] s = new String[T];
		
		//先读入T组数据并存储
		for (int i = 0; i < T; i++){
			scanner.nextLine();
			a[i] = scanner.nextInt();
			s[i] = scanner.next();
			b[i] = scanner.nextInt();
		}
		
		//处理T组数据,并输出
		int N = 0;
		AnotherXOR anotherXOR  =  new AnotherXOR();
		for (int i = 0; i < T; i++){
			N = s[i].length() + 1;
			System.out.println(anotherXOR.addBasedN(anotherXOR.convertToNBased(a[i], N), anotherXOR.convertToNBased(b[i], N), N));
		}
	}
}



0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics