注意点:
大数相加的时候没有判断数字的正负,
如果都是正数,那么就可以按照正数相加来计算,
如果是一正一负可以转换成大整数相减,
两个负数可以先保存符号,然后相加。
加法和减法的输入都不包括符号
加法
-
public String bigNumberAdd(String f, String s) {
-
System.out.print(
"加法:" + f +
"+" + s +
"=");
-
// 翻转两个字符串,并转换成数组
-
char[] a =
new StringBuffer(f).reverse().toString().toCharArray();
-
char[] b =
new StringBuffer(s).reverse().toString().toCharArray();
-
int lenA = a.length;
-
int lenB = b.length;
-
// 计算两个长字符串中的较长字符串的长度
-
int len = lenA > lenB ? lenA : lenB;
-
int[] result =
new
int[len +
1];
-
for (
int i =
0; i < len +
1; i++) {
-
// 如果当前的i超过了其中的一个,就用0代替,和另一个字符数组中的数字相加
-
int aint = i < lenA ? (a[i] -
'0') :
0;
-
int bint = i < lenB ? (b[i] -
'0') :
0;
-
result[i] = aint + bint;
-
}
-
// 处理结果集合,如果大于10的就向前一位进位,本身进行除10取余
-
for (
int i =
0; i < result.length; i++) {
-
if (result[i] >=
10) {
-
result[i +
1] += result[i] /
10;
-
result[i] %=
10;
-
}
-
}
-
StringBuffer sb =
new StringBuffer();
-
// 该字段用于标识是否有前置0,如果有就不要存储
-
boolean flag =
true;
-
// 注意从后往前
-
for (
int i = len; i >=
0; i--) {
-
if (result[i] ==
0 && flag) {
-
continue;
-
}
else {
-
flag =
false;
-
}
-
sb.append(result[i]);
-
}
-
// 结果
-
System.out.println(sb.toString());
-
return sb.toString();
-
}
减法
-
public static String bigNumberSub(String f, String s) {
-
System.out.print(
"减法:" + f +
"-" + s +
"=");
-
// 将字符串翻转并转换成字符数组
-
char[] a =
new StringBuffer(f).reverse().toString().toCharArray();
-
char[] b =
new StringBuffer(s).reverse().toString().toCharArray();
-
int lenA = a.length;
-
int lenB = b.length;
-
// 找到最大长度
-
int len = lenA > lenB ? lenA : lenB;
-
int[] result =
new
int[len];
-
// 表示结果的正负
-
char sign =
'+';
-
// 判断最终结果的正负
-
if (lenA < lenB) {
-
sign =
'-';
-
}
else
if (lenA == lenB) {
-
int i = lenA -
1;
-
// 找到第一个不相等的
-
// 注意下标0处理
-
while (i >
0 && a[i] == b[i]) {
-
i--;
-
}
-
if (a[i] < b[i]) {
-
sign =
'-';
-
}
-
}
-
// 计算结果集,如果最终结果为正,那么就a-b否则的话就b-a
-
for (
int i =
0; i < len; i++) {
-
int aint = i < lenA ? (a[i] -
'0') :
0;
-
int bint = i < lenB ? (b[i] -
'0') :
0;
-
if (sign ==
'+') {
-
result[i] = aint - bint;
-
}
else {
-
result[i] = bint - aint;
-
}
-
}
-
// 如果结果集合中的某一位小于零,那么就向前一位借一,
-
// 然后将本位加上10。其实就相当于借位做减法
-
for (
int i =
0; i < result.length -
1; i++) {
-
if (result[i] <
0) {
-
result[i +
1] -=
1;
-
result[i] +=
10;
-
}
-
}
-
-
StringBuffer sb =
new StringBuffer();
-
// 如果最终结果为负值,就将负号放在最前面,正号则不需要
-
if (sign ==
'-') {
-
sb.append(
'-');
-
}
-
// 判断是否有前置0
-
boolean flag =
true;
-
for (
int i = len -
1; i >=
0; i--) {
-
if (result[i] ==
0 && flag) {
-
continue;
-
}
else {
-
flag =
false;
-
}
-
sb.append(result[i]);
-
}
-
// 结果为一位且是0,被上面的for处理了
-
// 如果最终结果集合中没有值,就说明是两值相等,最终返回0
-
if (sb.toString().equals(
"")) {
-
sb.append(
"0");
-
}
-
// 返回值
-
System.out.println(sb.toString());
-
return sb.toString();
-
}
<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"> <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-thumbsup"></use> </svg><span class="name">点赞</span> <span class="count">1</span> </a></li> <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true"> <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-Collection-G"></use> </svg><span class="name">收藏</span></a></li> <li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{"mod":"1582594662_002"}"><svg class="icon" aria-hidden="true"> <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-fenxiang"></use> </svg>分享</a></li> <!--打赏开始--> <!--打赏结束--> <li class="tool-item tool-more"> <a> <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg> </a> <ul class="more-box"> <li class="item"><a class="article-report">文章举报</a></li> </ul> </li> </ul> </div> </div> <div class="person-messagebox"> <div class="left-message"><a href="https://blog.csdn.net/mine_song"> <img src="https://profile.csdnimg.cn/5/2/7/3_mine_song" class="avatar_pic" username="mine_song"> <img src="https://g.csdnimg.cn/static/user-reg-year/1x/8.png" class="user-years"> </a></div> <div class="middle-message"> <div class="title"><span class="tit"><a href="https://blog.csdn.net/mine_song" data-report-click="{"mod":"popu_379"}" target="_blank">mine_song</a></span> </div> <div class="text"><span>发布了251 篇原创文章</span> · <span>获赞 277</span> · <span>访问量 67万+</span></div> </div> <div class="right-message"> <a href="https://bbs.csdn.net/topics/395532177" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-messageboard">他的留言板 </a> <a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379"}">关注</a> </div> </div> </div>

本文详细介绍了如何实现大数之间的加法和减法运算,通过字符串翻转和数组转换的方法,实现了任意精度的数值计算。文章涵盖了正数、负数以及一正一负数的运算处理。
1670

被折叠的 条评论
为什么被折叠?



