您的位置:首页 > 编程语言 > Java开发

九度Online Judge | 题目1016:火星A+B

2013-07-09 17:41 302 查看
题目描述:
读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……

输入:
测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。

输出:
对每个测试用例输出1行,即火星表示法的A+B的值。

样例输入:
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0


样例输出:
1,0,1
1,1,1,0
1,0,0,0,0,0


分析:
首先是质数的获取,对于这道题目,事先定义好是最便捷的方式。如果位数很大很大的话,也可以自己在程序中获取:1.遍历法(复杂度高);2.筛选法(依次踢出2、3、5...的倍数,推荐)。

然后就是普通的加法运算了,注意进位和输出的顺序即可。


个人解答:

import java.util.Scanner;

public class MarsPlus {
private static int[] prime = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 };

private static void plus(String[] a, String[] b) {
int m = a.length;
int n = b.length;

int r = m > n ? m : n;
int[] c = new int[r];

boolean carry = false;
for (int i = 0; i < r; ++i) {
int tmp = carry ? 1 : 0;
if (i < m) {
tmp += Integer.parseInt(a[m - 1 - i]);
}
if (i < n) {
tmp += Integer.parseInt(b[n - 1 - i]);
}
if (tmp >= prime[i]) {
c[i] = tmp % prime[i];
carry = true;
} else {
c[i] = tmp;
carry = false;
}
}
if (carry) {
System.out.print("1,");
}
for (int i = r - 1; i > 0; --i) {
System.out.print(c[i] + ",");
}
System.out.println(c[0]);
}

public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
String line = reader.nextLine();
while (!line.startsWith("0")) {
String[] numStr = line.split(" ");
String[] a = numStr[0].split(",");
String[] b = numStr[1].split(",");
plus(a, b);
line = reader.nextLine();
}
reader.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息