Java大整数遇到的问题
最近做了一道题目涉及到(17591026060782+2)*17591026060781/2这样的计算,于是我就开始打算用java来计算,但是遇到了一些问题,如下:
- java中的整数范围
- 如何计算大整数乘法
- 如何计算大整数加法
- for循环中遇到的大整数问题
- 最后没有java,跑不动,用了python
1. java中的整数范围
byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)
short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)
2.计算大整数乘法
我将大整数乘法化为大整数加法,这个过程就需要解决两个问题,分别见3,4
3.计算大整数加/减法
代码如下:主要参考加法和减法的两个函数
public class AddSub{
public static void main(String[] args) {
String b="140728208486248";
String a="140728208486248";
//17591026060781
int []pa=stringToInts(a);
int []pb=stringToInts(b);
String ans=add(pa, pb);
//String ans_sub=sub(pb,pa);
//System.out.println(ans_add);
//System.out.println(ans_sub);
//8795513030392
for(long i=0;i<1099439128799L;i++){
int[] sum=stringToInts(ans);
ans=add(sum,pa);
//System.out.println(i);
}
System.out.println(ans);
}
public static int[] stringToInts(String s){
int[] n = new int[s.length()];
for(int i = 0;i<s.length();i++){
n[i] = Integer.parseInt(s.substring(i,i+1));
}
return n;
}
public static String add(int []a,int []b){
StringBuffer sb=new StringBuffer();
int a_len=a.length-1;
int b_len=b.length-1;
int jinwei=0;
while(a_len>=0||b_len>=0){
int temp=0;
if(a_len>=0&&b_len>=0){
temp=a[a_len]+b[b_len]+jinwei;
}else if(a_len>=0){
temp=a[a_len]+jinwei;
}else if(b_len>=0){
temp=b[b_len]+jinwei;
}
sb.append(temp%10+"");
jinwei=temp/10;
a_len--;b_len--;
}
sb.append(jinwei);
return getNum(sb.reverse());
}
/*
public static String sub(int []a,int []b){
StringBuffer sb=new StringBuffer();
boolean flag=false;
if(a.length<b.length){
int c[]=a;
a=b;b=c;
flag=true;
}
int a_len= a.length-1;
int b_len=b.length-1;
int jiewei=0;
while(a_len>=0||b_len>=0){
int temp=0;
if(a_len>=0&&b_len>=0){
if((a[a_len]-jiewei)<b[b_len]){
temp=a[a_len]+10-b[b_len]-jiewei;
jiewei=1;
}else{
temp=a[a_len]-b[b_len]-jiewei;
}
}else if(a_len>=0){
temp=a[a_len]-jiewei;
jiewei=0;
}
sb.append(temp+"");
a_len--;b_len--;
}
if(flag){
return getNum(sb.append("-").reverse());
}
return getNum(sb.reverse());
}*/
public static String getNum(StringBuffer sb){
while(sb.length() > 1 && sb.charAt(0) == '0') {
sb.deleteCharAt(0);
}
return sb.toString();
}
}
public class AddSub{
public static void main(String[] args) {
String b="140728208486248";
String a="140728208486248";
//17591026060781
int []pa=stringToInts(a);
int []pb=stringToInts(b);
String ans=add(pa, pb);
//String ans_sub=sub(pb,pa);
//System.out.println(ans_add);
//System.out.println(ans_sub);
//8795513030392
for(long i=0;i<1099439128799L;i++){
int[] sum=stringToInts(ans);
ans=add(sum,pa);
//System.out.println(i);
}
System.out.println(ans);
}
public static int[] stringToInts(String s){
int[] n = new int[s.length()];
for(int i = 0;i<s.length();i++){
n[i] = Integer.parseInt(s.substring(i,i+1));
}
return n;
}
public static String add(int []a,int []b){
StringBuffer sb=new StringBuffer();
int a_len=a.length-1;
int b_len=b.length-1;
int jinwei=0;
while(a_len>=0||b_len>=0){
int temp=0;
if(a_len>=0&&b_len>=0){
temp=a[a_len]+b[b_len]+jinwei;
}else if(a_len>=0){
temp=a[a_len]+jinwei;
}else if(b_len>=0){
temp=b[b_len]+jinwei;
}
sb.append(temp%10+"");
jinwei=temp/10;
a_len--;b_len--;
}
sb.append(jinwei);
return getNum(sb.reverse());
}
/*
public static String sub(int []a,int []b){
StringBuffer sb=new StringBuffer();
boolean flag=false;
if(a.length<b.length){
int c[]=a;
a=b;b=c;
flag=true;
}
int a_len= a.length-1;
int b_len=b.length-1;
int jiewei=0;
while(a_len>=0||b_len>=0){
int temp=0;
if(a_len>=0&&b_len>=0){
if((a[a_len]-jiewei)<b[b_len]){
temp=a[a_len]+10-b[b_len]-jiewei;
jiewei=1;
}else{
temp=a[a_len]-b[b_len]-jiewei;
}
}else if(a_len>=0){
temp=a[a_len]-jiewei;
jiewei=0;
}
sb.append(temp+"");
a_len--;b_len--;
}
if(flag){
return getNum(sb.append("-").reverse());
}
return getNum(sb.reverse());
}*/
public static String getNum(StringBuffer sb){
while(sb.length() > 1 && sb.charAt(0) == '0') {
sb.deleteCharAt(0);
}
return sb.toString();
}
}
4.for循环中遇到的问题
for(long i=0;i<1099439128799;i++)
这里报错,中间那个数字越界了,但是我明明定义的i是long型,为什么会越界。请教别人之后,才发现定义的是i而和后边的那个大数没有关系,后边那个数字后应加上l(L)。