大数字运算

举报
陈皮的JavaLib 发表于 2021/06/09 23:08:02 2021/06/09
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。