web-dev-qa-db-ja.com

Javaで任意の長さの2つの数値を追加するにはどうすればよいですか?

Javaで任意の長さの2つの数値を追加するにはどうすればよいですか?

たとえば、Java longサイズは64ビットです。したがって、最大範囲は-9223372036854775808〜9223372036854775807です。正しいですか?

したがって、以下のようにこれよりも大きい数を追加したい場合は、エラーが発生します

「整数が大きすぎます」

長いa = 9223372036854775807L;
long b = 9223372036854775808L;

Cでは、これらの数値をchar配列として取得できます。各charのアドレスをトラバースし、データ構造を使用することで、任意のサイズの2つの数値を追加できます。

それを行う方法Java。 Stringの各文字のアドレスをトラバースできますか?.


ご回答ありがとうございます。

数字を文字列として渡し、最後から各文字を追加してコーディングしようとしました。それは私にとってはうまくいきます。

BigIntegerを使用した2つの非常に大きな数の加算と、上記で指定したメソッドとの間に大きな違いはありますか(最後から各文字を加算し、残りを一時変数に格納して続行します)。 BigIntegerの基本的なメカニズムは私のコードと同じですか(最後から各文字を追加します)?

ありがとう。

14
Manoj

BigInteger を使用できます。

BigInteger a = new BigInteger("9223372036854775807");
BigInteger b = new BigInteger("9223372036854775808");
BigInteger result = a.add(b);

BigIntegerを使用すると、任意のサイズの数値を処理できますが、longまたはintよりもかなりのパフォーマンスが低下します。

20
jjnguy

BigIntegerを使用すると、任意のサイズの数値を処理できますが、longまたはintよりもかなりのパフォーマンスが低下します。

実際、この操作を1回だけ実行する必要がある場合(ユーザーが2つの数値を入力し、結果を取得する場合)、BigIntegerを使用しても問題ありません。ただし、加算演算を何度も実行する必要がある場合は、実際には独自のビッグ整数の実装を使用できます。私がACMマッチで競争していたとき、私たちはしばしばchar配列(C++)に基づく独自の実装を使用しました。次のコードをお勧めします。 AとBの2つの整数配列があると想定されます。A [0]およびB [0]対応する数値のレンズを格納します。 A [i]およびB [i]は数字自体を格納します。 A [1]およびB [1]は最下位桁です。したがって、番号1234は次のような配列に対応します:{4,4,3,2,1}。

ここで、これらの数値を合計して、同じ形式で配列Cに格納するとします。使用できるコードの例を次に示します。

int len1 = A[0],  len2 = B[0], divisor = 0;
int len = len1 >= len2 ? len1 : len2;
for (int i=1;i<=len;i++) {
  if (i>len1) C[i] = B[i]+divisor;
  else if (i>len2) C[i] = A[i]+divisor;
  else C[i] = A[i]+B[i]+divisor;
  divisor = C[i]/10;
  C[i] %= 10;
}
while (divisor>0) {
  C[++len] = divisor%10;
  divisor /= 10;
}
C[0] = len;

このコードは、算術加算の単純なルールを使用しており、BigIntegerの一般的な実装よりも大幅に高速に動作するはずです。それを使って楽しんでください。

6
SPIRiT_1984

BigInteger を使用します。 ここ は一例です。

サンプルコード(上記のリンクに基づく)-

BigInteger reallyBig1 = new BigInteger("1234567890123456890");
BigInteger reallyBig2 = new BigInteger("2743534343434361234");
reallyBig = reallyBig.add(reallyBig2);
6
Gopi

BigIntegerクラスをチェックしてください。それはあなたが探している操作を本当に大きな数で実行することができるでしょう。

http://download.Oracle.com/javase/1.4.2/docs/api/Java/math/BigInteger.html

3
Sam Day

BigIntegerを使用した2つの非常に大きな数の加算と、上記で指定したメソッドとの間に大きな違いはありますか(末尾から各文字を加算し、残りを一時変数に格納して続行します)。

違いは、たとえば、より大きな基数を使用できることです。基数が10だけでなく、10000であるとします。前の回答のコードが次のように変更される場合:

int len1 = A[0],  len2 = B[0], divisor = 0;
int len = len1 >= len2 ? len1 : len2;

for (int i=1;i<=len;i++) {
  if (i>len1) C[i] = B[i]+divisor;
  else if (i>len2) C[i] = A[i]+divisor;
  else C[i] = A[i]+B[i]+divisor;
  divisor = C[i]/10000;
  C[i] %= 10000;
}
while (divisor>0) {
  C[++len] = divisor%10000;
  divisor /= 10000;
}
C[0] = len;

その場合、コードは4倍高速に実行されます(仮想マシンは定数のみに依存するため、算術演算に違いはありません)。また、これは整数の配列が4分の1になることを意味します。これが引き起こす唯一の問題は、出力のフォーマット方法です。

1
SPIRiT_1984

スタッククラスを作成し、ユーザーから文字列として数値を取得し、それらを文字列に変換してスタックにプッシュします。ここでは、2つの大きな数を加算するための完全なコードを記述しました。スタッククラスも含まれています。 cmd javac mystack.Javaと入力するだけで、Java mystack

import Java.util.*;
public class mystack {
int maxsize=0;
int top=-1;
int array []=new int [0];


public mystack (int size)
{
    maxsize=size;
    array=new int [maxsize];
}

public void Push (int x)
{   
    top=top+1;
    array[top]=x;
}

public int pop ()
{
    int elt=array[top];
    top--;
    return elt;

}

public boolean stackisfull()
{
    return(top==maxsize-1);
}

public boolean stackisempty()
{
    return(top==-1);
}

public int peak ()
{
    int peak =array[top];
    return peak;
}

public static void main (String args[]){
Scanner in=new Scanner (System.in);

System.out.println("Enter the 1st number");
String number1 = in.nextLine();
System.out.println();
System.out.println("Enter the 2nd number");
String number2 = in.nextLine();
System.out.println();

String temp="";




 if(number1.length()>number2.length())
 {
    temp=number1;
    number1=number2;
    number2=temp;
 }

    int k=0;


 mystack S1 = new mystack (number1.length());

      for(int i=0;i<number1.length();i++)
       {
            String str=Character.toString(number1.charAt(i));
            S1.Push(Integer.parseInt(str));
       } 

 mystack S2 = new mystack (number2.length());

     for(int i=0;i<number2.length();i++)
        {
            String str=Character.toString(number2.charAt(i));
            S2.Push(Integer.parseInt(str));
        } 

 mystack S3 =new mystack (number2.length());

 while(!S1.stackisempty())
 {
     int x=S1.pop();
     int y=S2.pop();

     int times=(x+y+k)/10; int remainder =(x+y+k)%10;
     k=0;

     if(times==0)
     {
        S3.Push(remainder);
     }

     else
     {
         S3.Push(remainder);
         k=1;
     }
 }
    while(!S2.stackisempty())
    {
        if(k==1)
        {
            S3.Push(k+S2.pop());
            k=0; 
        }
       else
        S3.Push(S2.pop());
    }

    System.out.print("Addition is ");

    while(!S3.stackisempty())
    {
        System.out.print(S3.pop());
    }

}
}
1
neethan
    import Java.math.BigInteger;
    import Java.util.Scanner;

    public class BigIntergerSumExample {

        public static void main(String args[]) {

            BigInteger number1;
            BigInteger number2;
            BigInteger sum;
            Scanner sc = new Scanner(System.in);
            System.out.println("Enter the value of number 1");
            number1 = sc.nextBigInteger();
            System.out.println("Enter the value of number 2");
            number2 = sc.nextBigInteger();


            BigInteger a = new BigInteger(""+number1);
            BigInteger b = new BigInteger(""+number2);
            BigInteger result = a.add(b);

            System.out.println("Sum is Two numbers : -> " + result);
        }

    }

**OUTPUT IS** 

Enter the value of number 1
1111111111111111111111111111111111111111111111111
Enter the value of number 2
2222222222222222222222222222222222222222222222222
Sum is Two numbers : -> 
3333333333333333333333333333333333333333333333333

import Java.math.BigIntegerを使用すると、任意のサイズの数値を処理できます

0
Keshav Gera