大数字运算
【摘要】 1:背景 有时会遇到进行数字运算结果超过范围的情况,例如用一个int类型保留50的阶乘;两个大数字相乘等。
2:解决 可以利用数组进行保存结果。下面以两数字(258*18)相乘为例,原理为: a:将一乘数的每一位数字放进一个数组的末尾。 b:然后将每一位的数字与另一个乘数相乘,再将结果放回原来的数组位置。 c:从数组尾部,将每一位数字的个位数保留,十位以上的数字与...
1:背景
有时会遇到进行数字运算结果超过范围的情况,例如用一个int类型保留50的阶乘;两个大数字相乘等。
2:解决
可以利用数组进行保存结果。下面以两数字(258*18)相乘为例,原理为:
a:将一乘数的每一位数字放进一个数组的末尾。
b:然后将每一位的数字与另一个乘数相乘,再将结果放回原来的数组位置。
c:从数组尾部,将每一位数字的个位数保留,十位以上的数字与前一位相加。
d:最终结果为4644。
3:代码
public static int[] bigDataMultiply(int[] numOne, int numTwo) { // 先每一位相乘 for (int i = 0; i < numOne.length; i++) { numOne[i] *= numTwo; } // 进位和留位 for (int i = numOne.length - 1; i > 0; i--) { numOne[i-1] += numOne[i] / 10; numOne[i] = numOne[i] % 10; } return numOne;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
4:阶乘
有了上面的方法,就可以进行阶乘运算:
public class BigDataDemo { public static void main(String[] args) { // 运算10的阶乘 int n = 10; int[] result = new int[20]; result[result.length - 1] = 1; for (int i = 1; i <= n; i++) { result = bigDataMultiply(result, i); } boolean printZero = false; for (int i = 0; i < result.length; i++) { if ("0".equals(result[i]) && !printZero) { continue; } System.out.print(result[i]); printZero = true; } } public static int[] bigDataMultiply(int[] numOne, int numTwo) { // 先每一位相乘 for (int i = 0; i < numOne.length; i++) { numOne[i] *= numTwo; } // 进位和留位 for (int i = numOne.length - 1; i > 0; i--) { numOne[i-1] += numOne[i] / 10; numOne[i] = numOne[i] % 10; } return numOne; }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
结果:
文章来源: javalib.blog.csdn.net,作者:陈皮的JavaLib,版权归原作者所有,如需转载,请联系作者。
原文链接:javalib.blog.csdn.net/article/details/104858746
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)