号称史上最高奖金的编程大赛于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));
}
}
}