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

号称史上最高奖金的编程大赛于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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值