字符串实现大数的相加

使用字符串实现大数的相加,包含负数,下面直接上代码,转载请注明出处:

 

  1 /**
  2  * sum
  3  */
  4 public class sum {
  5 
  6     public static String add(String n1, String n2) {
  7         String res ;
  8         if(n1.charAt(0) != '-' && n2.charAt(0) != '-') {
  9             res =  getSum(n1,n2);
 10         }else if(n1.charAt(0) == '-' && n2.charAt(0) == '-')
 11             res ="-"+ getSum(n1.substring(1), n2.substring(1));
 12         else {
 13             res = getMinus(n1,n2);
 14         }
 15         //System.out.println(res);
 16         return res;
 17     }
 18 
 19     public static String getSum(String n1, String n2){
 20         int l1 = n1.length();
 21         int l2 = n2.length();
 22         char[] res;
 23         boolean flag = false;
 24 
 25         //根据长度创建存储结果的字符数组,因为可能存在最高位想加进位的情况,长度+1
 26         if(l1 >= l2) {
 27             res = new char[l1+1];
 28             flag = true;
 29         }  else{
 30             res = new char[l2+1];
 31         }
 32         
 33         int pos = res.length - 1; 
 34         int takeOver = 0;
 35         l1 --;
 36         l2 --;
 37         //从最低位开始相加,直到其中一个已经求和结束
 38         while(l1 >= 0 && l2 >= 0){
 39             int sum = n1.charAt(l1) - '0' + n2.charAt(l2) - '0' + takeOver;
 40             takeOver = 0;
 41             if(sum >= 10){
 42                 res[pos] = (char) (sum - 10+ '0');
 43                 takeOver = 1;
 44             } else {
 45                 res[pos] = (char) (sum+ '0');
 46             }
 47             l1 --;
 48             l2 --;
 49             pos --;
 50         }
 51 
 52         //把剩下的字符串复制到结果res,注意可能出现的tackOver进位存在
 53         if (flag) {
 54             while (l1 >= 0 && pos >= 0) {
 55                 int sum = n1.charAt(l1) - '0' + takeOver;
 56                 takeOver = 0;
 57                 if(sum >= 10){
 58                     res[pos] = (char) (sum - 10 + '0');
 59                     takeOver = 1;
 60                 } else {
 61                     res[pos] = (char) (sum + '0');
 62                 }
 63                 l1 --;
 64                 pos --;
 65             }
 66         } else {
 67             while (l2 >= 0 && pos >= 0) {
 68                 int sum = n2.charAt(l1) - '0' + takeOver;
 69                 takeOver = 0;
 70                 if(sum >= 10){
 71                     res[pos] = (char) (sum - 10 + '0');
 72                     takeOver = 1;
 73                 } else {
 74                     res[pos] = (char) (sum+ '0');
 75                 }
 76                 l2 --;
 77                 pos --;
 78             }
 79         }
 80         //如果两个字符串的长度相等,那么就需要考虑向最高位进位的情况,这里要加上进位
 81         res[pos] = (char) ('0' + takeOver);
 82 
 83         String str = new String(res);
 84         //对开始为0的情况需要处理
 85         if (str.charAt(0) == '0') {
 86             str = str.substring(1);
 87         }
 88         return str;
 89     }
 90 
 91     public static String getMinus( String n1, String n2){
 92         boolean n1Nagative = false; // n1 is -
 93         boolean n2Nagative = false; // n2 is -
 94         boolean isLarger = false;
 95         boolean isNagative = false;
 96         String  res = null;
 97         //判断n1是否为负数,并取出数值部分
 98         if(n1.charAt(0) == '-') {
 99             n1Nagative = true;
100             n1 =  n1.substring(1);
101         }
102         //判断n2是否为负数,并取出数值部分
103         if (n2.charAt(0) == '-') {
104             n2Nagative = true;
105             n2 = n2.substring(1);
106         }
107         if(n1Nagative){
108             //判断n1是否大于n2,如果大于,那么结果为负值
109             isLarger = isLarger(n1,n2);
110             if (isLarger) {
111                 isNagative = true;
112                 res = bigDigitalSub(n1, n2);//实现n1 - n2 
113             } else {
114                 isNagative = false; //此时结果为正,n2 > n1
115                 res = bigDigitalSub(n2, n1); //实现n2 - n1
116             }
117         } 
118         if(n2Nagative) {
119             //判断n2是否大于n1,如果大于,那么结果为负值
120             isLarger = isLarger(n2,n1);
121             if (isLarger) { //n2 > n1;
122                 isNagative = true;
123                 res = bigDigitalSub(n2, n1);//实现n2 - n1
124             } else {
125                 isNagative = false;//此时结果为正,n1 > n2
126                 res = bigDigitalSub(n1, n2);//实现n1 - n2 
127             }
128         }
129         return isNagative?"-" + res:res;
130     }
131     public static String bigDigitalSub(String a, String b){
132         //翻转字符串并转化成数组
133         char[] aArray = new StringBuilder(a).reverse().toString().toCharArray();
134         char[] bArray = new StringBuilder(b).reverse().toString().toCharArray();
135         int aLength = aArray.length;
136         int bLength = bArray.length;
137          //找到最大的位数,两个整数的差的位数小于等于两个整数中的最大位数
138          int maxLength = aLength > bLength ? aLength : bLength;
139          int[] result = new int[maxLength];
140          //开始计算结果集
141         for (int i = 0; i < maxLength; i++) {
142             int aInt = i < aLength ? aArray[i] - '0' : 0;
143             int bInt = i < bLength ? bArray[i] - '0' : 0;
144             // if (sign == '-') result[i] = bInt - aInt;
145             // else result[i] = aInt - bInt;
146             result[i] = aInt - bInt;
147         }
148         //处理结果集,如果结果集中的某一位小于0,则向高位借位,然后将本位加10
149         for (int i = 0; i < maxLength - 1; i++) {
150             if (result[i] < 0) {
151                 result[i + 1] -= 1;
152                 result[i] += 10;
153             }
154         }
155         //处理结果集,转化成真正结果
156         StringBuffer realResult = new StringBuffer();
157         boolean isBeginning = true;
158         for (int i = maxLength - 1; i >= 0; i--) {
159             if (result[i] == 0 && isBeginning) continue;
160             else isBeginning = false;
161             realResult.append(result[i]);
162         }
163         if (realResult.toString().equals("")) realResult.append('0');
164         return realResult.toString();
165     }
166 
167     public static boolean isLarger(String n1, String n2){
168         boolean res= false;
169         if (n1.length() > n2.length()) {
170             res = true; // n1 > n2
171         } else if (n1.length() ==  n2.length()) {
172             for(int i = 0; i < n1.length(); i++){
173                 if (n1.charAt(i) < n2.charAt(i)) {
174                     res =  false; //n2 > n1
175                     break;
176                 }
177             }
178             res =  true;
179         } else if(n1.length() < n2.length()) {
180             res =  false; // n2 > n1;
181         }
182         return res;
183     }
184     public static void main(String[] args) {
185         String n1 = "12345";
186         String n2 = "-112300";
187         System.out.println(add(n1, n2));
188     }
189 }

 

转载于:https://www.cnblogs.com/chailinbo/p/9285687.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值