• PAT(B) 1074 宇宙无敌加法器(Java)


    题目链接:1074 宇宙无敌加法器 (20 point(s))

    题目描述

    地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”。每个 PAT 星人都必须熟记各位数字的进制表,例如“……0527”就表示最低位是 7 进制数、第 2 位是 2 进制数、第 3 位是 5 进制数、第 4 位是 10 进制数,等等。每一位的进制 d 或者是 0(表示十进制)、或者是 [2,9] 区间内的整数。理论上这个进制表应该包含无穷多位数字,但从实际应用出发,PAT 星人通常只需要记住前 20 位就够用了,以后各位默认为 10 进制。

    在这样的数字系统中,即使是简单的加法运算也变得不简单。例如对应进制表“0527”,该如何计算“6203 + 415”呢?我们得首先计算最低位:3 + 5 = 8;因为最低位是 7 进制的,所以我们得到 1 和 1 个进位。第 2 位是:0 + 1 + 1(进位)= 2;因为此位是 2 进制的,所以我们得到 0 和 1 个进位。第 3 位是:2 + 4 + 1(进位)= 7;因为此位是 5 进制的,所以我们得到 2 和 1 个进位。第 4 位是:6 + 1(进位)= 7;因为此位是 10 进制的,所以我们就得到 7。最后我们得到:6203 + 415 = 7201。

    输入格式

    输入首先在第一行给出一个 N 位的进制表(0 < N ≤ 20),以回车结束。 随后两行,每行给出一个不超过 N 位的非负的 PAT 数。

    输出格式

    在一行中输出两个 PAT 数之和。

    输入样例

    30527
    06203
    415
    

    输出样例

    7201
    

    Java代码

    /**********************************************************************************
    Submit Time			Status		Score	Problem	Compiler		Run Time	User
    8/20/2019, 21:47:20	Accepted	20		1074	Java (openjdk)	86 ms		wowpH
    **********************************************************************************/
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    public class Main {
    	public static void main(String[] args) throws Exception {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringBuilder sb = new StringBuilder(br.readLine()).reverse();	// 反转
    		char[] scale = sb.toString().toCharArray();						// 进制
    		String zero = "00000000000000000000";							// 0串
    		sb = new StringBuilder(br.readLine()).reverse();				// 反转
    		sb.append(zero.substring(0, scale.length - sb.length()));		// 高位补0
    		char[] a = sb.toString().toCharArray();							// 数a
    		sb = new StringBuilder(br.readLine()).reverse();				// 反转
    		sb.append(zero.substring(0, scale.length - sb.length()));		// 高位补0
    		char[] b = sb.toString().toCharArray();							// 数b
    		StringBuilder sum = new StringBuilder(21);						// 和
    		int carry = 0;													// 进位
    		for (int i = 0; i < scale.length; ++i) {						// 逐位计算
    			int bitSum = (a[i] - 48) + (b[i] - 48) + carry;			// 当前位的和
    			int bitScale = scale[i] - 48;							// 进制
    			if (0 == bitScale) {									// 0表示10进制
    				bitScale = 10;
    			}
    			sum.append((char) (bitSum % bitScale + 48));				// 当前位
    			carry = bitSum / bitScale;									// 新的进位
    		}
    		sum.append((char) (carry + 48));						// 添加到高位
    		String ans = sum.reverse().toString();					// 反转得到最终结果
    		ans = ans.replaceAll("^0+", "");						// 去掉前面的0串
    		System.out.println(ans.length() < 1 ? 0 : ans);			// 输出结果
    	}
    }
    

    提交结果

    提交结果

  • 相关阅读:
    关于scanf、getchar、getch、getche缓冲区分析——C语言
    堆排序(大顶堆、小顶堆)----C语言
    预处理命令使用详解----#if、#endif、#undef、#ifdef、#else、#elif
    参数传递---关于数组的退化
    控制台API函数----HANDLE、SetConsoleCursorPosition、SetConsoleTextAttribute
    二叉树的遍历(前序、中序、后序、已知前中序求后序、已知中后序求前序)
    Fiddler 插件开发,使用 WPF 作为 UI 控件
    从程序集加载类型,遇到 ReflectionTypeLoadException 的处理办法
    如何将应用程序与文件类型(文件扩展名)关联起来?
    为什么 WPF 的 Main 方法需要标记 STAThread 。
  • 原文地址:https://www.cnblogs.com/wowpH/p/11687420.html
Copyright © 2020-2023  润新知