A + B Problem II

怎甘沉沦 提交于 2020-04-24 22:51:57

原创


HDOJ:http://acm.hdu.edu.cn/showproblem.php?pid=1002

  长度在1000以内的两个数相加是不可能直接相加的,我用的是模拟手工相加的方法,比如:1111+11,由于n位数相加最多只能

得到n+1位,所以可以写成01111+00011,这样考虑进位会方便一些,用户输出字符串,将字符串转换成字符数组,然后逐个将字符

数组的字符数字转换成int型考虑相加,相加以后再转换成char存放,过程涉及很多字符串String、StringBuilder、char、int的

相互转换,弄得头都大,输出格式注意一下就没多大问题了,以下是自己写的Accepted代码:

 1 import java.util.*;
 2 
 3 public class HDOJ_1002 {
 4 
 5     public static void main(String[] args) {
 6         Scanner reader=new Scanner(System.in);
 7         int N=reader.nextInt();
 8         String Result[]=new String[N];    //存储N个结果字符串
 9         int count=0;
10         String s1[]=new String[N];
11         String s2[]=new String[N];
12         while(N>0) {
13             s1[count]=reader.next();
14             s2[count]=reader.next();
15             StringBuilder str1=new StringBuilder(s1[count]);
16             StringBuilder str2=new StringBuilder(s2[count]);
17             //首部加0
18             if(str1.length()>str2.length()) {
19                 str1.insert(0,'0');
20                 int differ=str1.length()-str2.length();
21                 while(differ>0) {
22                     str2.insert(0,'0');
23                     differ--;
24                 }
25             }
26             else {
27                 str2.insert(0,'0');
28                 int differ=str2.length()-str1.length();
29                 while(differ>0) {
30                     str1.insert(0,'0');
31                     differ--;
32                 }
33             }
34             String sss1=new String(str1);
35             String sss2=new String(str2);
36             char ss1[]=sss1.toCharArray();
37             char ss2[]=sss2.toCharArray();
38             //存储结果的字符数组的大小定义为max+1,因为两个n位数相加最多得到n+1位数字
39             int max=ss1.length;
40             char result[]=new char[max];
41             int index_ss1=ss1.length-1;    //ss1数组最后一位元素的索引
42             int index_ss2=ss2.length-1;    //ss2数组最后一位元素的索引
43             int index_res=result.length-1;    //结果数组索引
44             int flag=0;    //进位标志
45             while( (index_ss1>=0 && index_ss2>=0) || flag==1){
46                 if( index_ss1<0 && index_ss2<0 && flag==1 ) {
47                     result[index_res]='1';
48                     break;
49                 }
50                 int tra1=ss1[index_ss1]-'0';
51                 int tra2=ss2[index_ss2]-'0';
52                 int res_tra;
53                 if(flag==1) {    //后面有进位
54                     res_tra=tra1+tra2+1;
55                     flag=0;    //勿忘
56                 }
57                 else {
58                     res_tra=tra1+tra2;
59                 }
60                 if(res_tra>=10) {    //有进位
61                     res_tra-=10;
62                     flag=1;
63                 }
64                 result[index_res]=(char)(res_tra+48);
65                 index_ss1--;
66                 index_ss2--;
67                 index_res--;
68             }
69             if(result[0]=='0') {
70                 String ss=new String(result);
71                 StringBuilder sss=new StringBuilder(ss);
72                 sss.deleteCharAt(0);
73                 ss=new String(sss);
74                 Result[count]=new String(ss);
75             }
76             else {
77                 Result[count]=String.valueOf(result);
78             }
79             N--;
80             count++;
81         }
82         for(int i=0;i<count;i++) {
83             System.out.println("Case "+(i+1)+":");
84             System.out.println(s1[i]+" "+"+"+" "+s2[i]+" "+"="+" "+Result[i]);
85             if(i<count-1) {
86                 System.out.println();
87             }
88         }
89     }
90 
91 }

19:45:00

2018-08-16

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!