• ベストアンサー

Long型でデータがあふれる場合・・・

Javaで「2の1000乗」を表示させる簡単なプログラムを作成したのですが データ型で一番大きいLong型で処理してもデータが入りきらず溢れてしまうのです。 (当然と言えば当然なのですが・・・) このような場合、どのようにすれば「2の1000乗」の結果を 表示することができるのでしょうか。 いろいろ、考えてみたのですがどうしても思いつきません。 何かいい手法を教えていただきたいのです。 どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

Javaでないのですが、アルゴリズムのご参考に載せます。2のn乗で1000桁まで求めるものにしています。 私が興味が持ったのでやって見ました。極く初歩的なやり方 です。各a(i)に4桁数字を持たせたのは慣行らしくて。 (1)2^nを(10進表示で)その時点で記録する配列をa(250)   用意する。 (2)a(m)に記録するのは10進表示数0から9999までの   どれか4桁の1つの整数とする。 (3)上記250の由来は各配列に4桁分数字が記録されるの   で、1000桁は1000÷4=250個で記録できる   からである。 (4)a(1)には、2^nの10進数表示の      1  ~   9999(=10^4-1)    までの数字桁を保持する。    a(2)には、2^nの10進数表示の      10001~ 99999999(=10^8-1   )    までの数字桁を保持する。    a(3)には、2^nの10進数表示の      1000000001 ~ 9999999999   99(=10^12-1)    までの数字桁を保持する。以下同様で省略。    (5)mは今2^nが10進数表示でa()の配列の何番目ま   で入っている(使っている)かの先頭配列を示す。    2^13=8192だからn=13まではm=1です。    配列1個で間に合うのです。 (6)2^nは2^1を求め、それに2を掛け、さらに    2を掛けるようにしてn回繰り返しています。   (7)VBが手許で使いやすいのでVBでやりましたが    for()文、if文、四則演算しか使ってないのでJava   に置き換えは簡単でしょう。     Private Sub Form_Click()  Dim a(250)  a(1) = 1 '2^0=1から m = 1 cro = 0 '繰り上がり。次回a()を処理する時考慮 n = InputBox("2^n?=") For j = 1 To n For i = 1 To m If a(i) * 2 + cro >= 10 ^ 4 - 1 Then a(i) = a(i) * 2 + cro - 10 ^ 4 cro = 1 Else a(i) = a(i) * 2 + cro cro = 0 End If Next i If cro = 1 Then a(m + 1) = cro cro = 0 m = m + 1 End If Next j MsgBox "2^" & n & "=" & a(3) & "," & a(2) & "," & a(1) End Sub   nが36までは、エクセルで結果確認済み。それ以上は   何か表にでも載っておれば確認してください。   最後のa(1)からa(m)の印字は、Javaに合わせて   改良してください。   1000桁になる必要桁数 n>250*log10/log2だと思いま  すが、対数表が手許になく計算はよろしく。 2の1000乗が10進数で何桁かはn>1000*log2/log10で求まるでしょう。

noname#4663
質問者

お礼

うおー、ロジックを考えてくださったのですか。ありがとうございます。 わたしもこれを参考に組んでみますね。まだまだ勉強不足ですね。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • mojimojio
  • ベストアンサー率51% (14/27)
回答No.1

一般的には、配列に数値データを格納するようにして、四則演算を自前で実装したりすると思います。 Javaでは、java.math.BigIntegerというクラスが用意されているので、これを使うと簡単です。

noname#4663
質問者

お礼

BigIntegerですか。やってみました。powというメソッドを使用すれば 簡単に結果を表示できました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • データ未入力時のエラー処理がうまくできません・・・

    現在、JSPファイルを作成しています。その内容は、HTMLで表示されたテキストボックスにデータを入力し、 次のページでそのデータを表示させるものです。 データが未処理の場合のJavaのプログラムは、以下のようになります。 if(txtInpA == "") { データが未入力時のエラー処理 }else{ データが入っているときの処理   } *「txtInpA」にデータが入っています。 しかし、このプログラムだと正常に処理してくれません。 「""」の代わりに「null」としても同じです。 また、データを取得するメソッド「request.getParameter()」を使っても 同様にうまく処理をしてくれません。 なにかよい方法があればぜひ教えてください。お願い致します。

    • ベストアンサー
    • Java
  • long型のデータをバイト型の配列に代入する方法

    long型のデータを配列を使って1byte毎に分けたい処理を作りたいのですが、 やりかたとしてはlong型のアドレスをポインタ変数に渡して、 ポインタ変数をバイト配列に代入する方法になりますでしょうか? 具体的なプログラムはこんな感じと考えてますが unsigned long LONG: unsigned char AAA[8], *pon, i: pon = &LONG for(i=0 i<8 i++) { AAA[i] = *pon + i; } C言語に詳しい方教えてください、よろしくお願いします。

  • サーバーからのデーター取得について

    他のPCからjavaでpost送信したデーターをサーバーを通して自分のPCにPHPで表示する勉強をしています。 他のPCからサーバーにはアクセスできてデーターは送信されているようですが、自分で作成したPHPのプログラムではPCで見ることができません。 もしよろしければ自分のPCで表示するためサーバーからデータを取得するプログラム、参考サイトを教えてください。 JAVAは少々分かりますが、PHPは素人になります。 お願いします。

    • ベストアンサー
    • PHP
  • データ項目にタグが含まれている場合の表示

    初めて投稿させていただきます。 PHPというかオープン系の初心者です。 データ項目にタグが含まれている場合の処理方法を教えてください。 下記の場合、プログラムで編集するべきなのかsmartyのテンプレートで指定すればいいのか御教授ください。 なにぶん初心者なのでお手柔らかにお願いいたします。 ◆データ中に含まれる内容 「<b>太字になる</b> <em>強調</em>しちゃうよ」 ◆期待する結果 「太字になる」を太字表示 改行して「強調」を強調表示 「しちゃうよ」を通常表示

    • ベストアンサー
    • PHP
  • 複数のJavaプログラムでデータを共有する方法について

    レベルの低い質問だとは思うのですが、相談にのってください。 Javaでコンソールプログラムを作っています。 コマンドプロンプトを複数立ち上げ、同じJAVAプログラムを同時に実行します。(プログラムは同じですが、処理内容はそれぞれ異なります。並列な処理です。) これら複数のプログラム同士でデータ(処理の進捗状況など)を共有するにはどうすればいいでしょうか。(そもそもそんなことができるのでしょうか) 今考えているのは、共有データ用のテキストファイルを1つ作り、それを各プログラムが参照(読んだり書き込んだり)する、ということ考えています。しかし、これだと複数のプログラム同士が同時にファイルを読み書きするようなタイミングがあるかもしれず、思ったような動作をしないかもしれません。 そこで、質問です。 (1)今回のような場合(コマンドプロンプトを複数立ち上げ、同じJAVAプログラムを同時に実行)で、データ共有に使えそうなトピックや方法があれば、お教えください。ヒントでもなんでもいいです。(とりあえず、ちょっとした付け焼刃でなんとか動いてほしいので……) (2)「コマンドプロンプトを複数立ち上げ、同じJAVAプログラムを同時に実行」しているのは、単に私の技術が低いからです。今後プログラムを根本的に書き直して改良するために、今後どのようなJavaのトピックを勉強すればいいでしょうか。 乱文失礼いたしました。どうかよろしくお願いします。

  • javaのJavaのガベージ・コレクション

    javaのJavaのガベージ・コレクションに付いて質問です。 動作環境は、Windows7で、javaですからVMで動作していると思います。 開発環境はEclipseのPleiades44です。 もともと、VC++6.0で出来上がったプログラムをjavaで別途、作成しています。 私のはAppは約1.6秒で測定が完結するもので、この1.6秒のサイクルを繰返します。 具体的な処理内容は、48000サンプリングの4chのusbデーターを取り込み、データー 処理し、画面に略リアルタイム表示するものです。 問題点 1)他の画像表示のプログラムと同時に走らせますと、双方のプログラムの動作   が、一時停止し、ギコチナイ動きとなります。 2)私のはAppを単体で(Windoes7のVM)で走らせていますが、データー   処理の結果に微妙な差が現れることがあります。 注)VC++の場合は、上記の様な不具合は全くありません。 Q1)javaのコードを一括メモリーにロードし、実行する方法はありますか?  (つまり、ガベージ・コレクションの機能は使用しないようにする) 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • COBOLで作成されたPACKED-DECIMAL型のデータをJavaで利用する場合の型は?

    COBOLで作成されたデータを受け取り、javaで処理する必要があるのですが、データの中にPACKED-DECIMALの形式の項目が存在します。 これは、double型で処理すれば問題ないのでしょうか? お手数ですが、よろしくお願いします。

    • ベストアンサー
    • Java
  • ロングトランザクションについて

    お世話になります。 長時間トランザクション処理を行おうと思うのですが、 (3000万件のデータを2つのテーブル間でコピーします。  トランザクション処理中、継続して論理ログのバックアップを行います) ロングトランザクション(そのまま?)という用語があり、 長時間のトランザクション処理には問題があると聞きました。 ロングトランザクションの問題について、ご存知の方、教えてください。 よろしくお願い致します。

  • Javaの問題(初心者向け、やや計算あり?)

    Javaの勉強中なのですが、以下のような問題が出ました。 ニュートンコーツの公式(のうちの台形公式)を用いて、y=xの2乗を0<=x<=1の区間で積分し、結果を表示するプログラムを作成せよ。刻み幅は任意に設定してよい。 …どのように解かれますか? さっぱりわからないのですが…。

    • ベストアンサー
    • Java
  • テストデータの作成

    課題でDBへアクセスできるjavaプログラムを作成したのですが、提出の際、テストデータをもってくるように言われたのですが・・・テストデータの作り方がわかりません。 どなたか教えていただけないでしょうか?よろしくお願いします。