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