PAT 1074 宇宙无敌加法器 (20 分)

地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 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

写的代码很乱,很不在状态,说说测试点吧。
测试点3,4是数非常大的时候, 如果使用数字作为输入,这测试点3,4,过不了,所以只能使用字符串作为输入。
测试点5是有进位的情况,最后一个测试点是输出为0的情况。
  1 import java.util.Arrays;
  2 import java.util.Scanner;
  3 
  4 public class Test {
  5     
  6     public static void main(String[] args) {
  7         Scanner sc = new Scanner(System.in);
  8         //将反转后的进制表存入数组a中。
  9         String temp = sc.next();
 10         StringBuilder temp1 = new StringBuilder(temp);
 11         temp1 = temp1.reverse();
 12         int[] a = new int[temp.length()];
 13         for(int i=0;i<temp1.length();i++) {
 14             a[i] = (temp1.charAt(i)-'0');
 15         }
 16         //将反转后的第一个数存入数组b中,注意去除多余的零
 17         String temp2 = sc.next();
 18         StringBuilder temp3 = new StringBuilder(temp2);
 19         int i1 = 0;
 20         for(i1=0;i1<temp2.length();i1++) {
 21             if(temp3.charAt(i1)!='0') 
 22                 break;
 23         }
 24         temp3.delete(0, i1);
 25         temp3 = temp3.reverse();
 26         int[] b = new int[temp3.length()];
 27         for(int i=0;i<temp3.length();i++) {
 28             b[i] = temp3.charAt(i)-'0';
 29         }
 30         //将反转后的第一个数存入数组c中,注意去除多余的零
 31         String temp4 = sc.next();
 32         StringBuilder temp5 = new StringBuilder(temp4);
 33         for(i1=0;i1<temp4.length();i1++) {
 34             if(temp5.charAt(i1)!='0') 
 35                 break;
 36         }
 37         temp5.delete(0, i1);
 38         temp5 = temp5.reverse();
 39         int[] c = new int[temp5.length()];
 40         for(int i=0;i<temp5.length();i++) {
 41             c[i] = temp5.charAt(i)-'0';
 42         }
 43         //如果输入两个数为零,输出0;
 44         if(temp5.length()==0&&temp3.length()==0) {
 45             System.out.println(0);
 46             System.exit(0);
 47         }
 48         StringBuilder sum = new StringBuilder();
 49         int i = 0;
 50         int flag = 0;//进制
 51         while(i<b.length&&i<c.length) {
 52             int k = 0;
 53             k = b[i]+c[i]+flag;
 54             int k1 = a[i];
 55             if(a[i]==0)
 56                 k1 = 10;
 57             if(k>=k1) {
 58                 k = k%k1;
 59                 flag = 1;
 60             }else {
 61                 flag = 0;
 62             }
 63             sum.append(k+"");
 64             i++;
 65         }
 66         while(i<b.length) {
 67             int k = 0;
 68             k = b[i]+flag;
 69             int k1 = a[i];
 70             if(a[i]==0)
 71                 k1 = 10;
 72             if(k==k1) {
 73                 flag = 1;
 74                 sum.append(0+"");
 75             }else {
 76                 flag = 0;
 77                 sum.append(k+"");
 78             }
 79             i++;
 80         }
 81         while(i<c.length) {
 82             int k = 0;
 83             k = c[i]+flag;
 84             int k1 = a[i];
 85             if(a[i]==0)
 86                 k1 = 10;
 87             if(k==k1) {
 88                 flag = 1;
 89                 sum.append(0+"");
 90             }else {
 91                 flag = 0;
 92                 sum.append(k+"");
 93             }
 94             i++;
 95         }
 96         if(flag==1) {
 97             System.out.print(1);
 98         }
 99         System.out.println(sum.reverse().toString());
100         
101         
102         
103         
104     }
105         
106 
107 }
 
原文地址:https://www.cnblogs.com/lolybj/p/9664934.html