• 締切済み

任意精度の整数を表わすクラスの定義

kuwatoro1の回答

回答No.1

補足をお願いします

Tamagawa
質問者

補足

非任意精度の非負整数を表わすクラスは // LongUnsigned -- 任意精度の非負整数 class LongUnsigned { private byte[] mDigits; // 整数値 public LongUnsigned(int n) { String numString = Integer.toString(Math.abs(n)); // Math.abs() は,絶対値を計算する静的メソッド int numLength = numString.length(); mDigits = new byte[numLength]; for (int i = 0; i < numLength; ++i) { mDigits[numLength - i -1] = (byte)(numString.charAt(i) - '0'); } } public LongUnsigned(byte[] digits) { mDigits = digits; } // 等値性の比較 public boolean equals(LongUnsigned n) { if (mDigits.length != n.mDigits.length) { return false; } for (int i = mDigits.length - 1; i >= 0; --i) { if (mDigits[i] != n.mDigits[i]) { return false; } } return true; } // 順序の比較 public boolean le(LongUnsigned n) { // a.le(b) は a <= b の意味 if (mDigits.length > n.mDigits.length) { return false; } else if (mDigits.length < n.mDigits.length) { return true; } for (int i = mDigits.length - 1; i >= 0; --i) { if (mDigits[i] > n.mDigits[i]) { return false; } else if(mDigits[i] < n.mDigits[i]) { return true; } } return true; } // 加算 public LongUnsigned add(LongUnsigned n) { byte[] a, b; if (mDigits.length >= n.mDigits.length) { a = mDigits; b = n.mDigits; } else { a = n.mDigits; b = mDigits; } byte[] ans = new byte[a.length]; byte carry = 0; for (int i = 0; i < a.length; ++i) { byte sum = (byte)(a[i] + carry); if (i < b.length) { sum = (byte)(sum + b[i]); } ans[i] = (byte)(sum % 10); carry = (byte)(sum / 10); } if (carry == 0) { return new LongUnsigned(ans); } else { byte[] ans2 = new byte[ans.length + 1]; for (int i = 0; i < ans.length; ++i) { ans2[i] = ans[i]; } ans2[ans.length] = 1; return new LongUnsigned(ans2); } } // 乗算 public LongUnsigned mul(LongUnsigned n) { LongUnsigned ans = new LongUnsigned(0); LongUnsigned i = new LongUnsigned(1); LongUnsigned one = new LongUnsigned(1); while (i.le(n)) { ans = ans.add(this); i = i.add(one); } return ans; } public LongUnsigned factorial() { LongUnsigned ans = new LongUnsigned(1); LongUnsigned i = new LongUnsigned(1); LongUnsigned one = new LongUnsigned(1); while (i.le(this)) { ans = ans.mul(i); i = i.add(one); } return ans; } //文字列への変換 public String toString() { String s = ""; for (int i = mDigits.length - 1; i >= 0; --i) { s = s + mDigits[i]; } return s; } } こうなります。

関連するQ&A

  • 偶数、奇数、倍数、約数について

    いろいろ調べたんですが、人によって違っていたりして分からず困っています・・・。 高校までの範囲では [1]偶数と奇数は負の範囲も含めて良いのでしょうか?。自分が調べた教科書や参考書によると、算数では、0以上の整数において偶数・奇数を定義しているのですが、中学・高校の数学では偶数・奇数についての定義は触れられていません。 [2]倍数に0は含めても良いのでしょうか?。算数の参考書などには、「ある整数に整数をかけてできる数のことを倍数、0の倍数やある数の0倍は考えないことにする」と書いてあります。人によっては、含めるだったり、含めないだったり・・・一体どうすれば・・・?。 [3]倍数・約数は負の範囲まで考えていいのでしょうか?。 [4]0の約数というのは考えても良いのでしょうか?。 以上4点です。どなたか詳しい方、教えてください。お願いしますm(__)m。

  • 行列のn乗について

    javaで複素行列のアルゴリズムを実装していて疑問に思ったのですが、 行列のn乗に関して、 (1) n = 0 (2) n は負の整数 (3) n は実数 (4) n は複素数 のそれぞれの場合に定義されていますでしょうか? 定義されている場合には、その概略を示していただくか 参考になるサイトをご紹介いただければ非常に幸いです。 以上、よろしくお願い申し上げます。

  • 整数の有名な定理

    a,bがと互いにそのとき、ab+1以上の「全ての自然数」はax+byで表すことが出来る。 この事実がテーマになった問題があり、参考として証明が書いてありましたが、なぜab+1以上なのかは書いてありませんでした。前提のようになっていました。 大学受験では必要ないですが気になるので一応教えてください。それともこういうことは捨てたほうがいいでしょうか。 「負でない整数」に変えるとab+1-a-b居所となっていることもなおさらわかりません。 教えてください。

  • 任意の値xについて

    関数の定義域について考えます。 この定義域の集合をMとします。 写像を図でイメージすると、集合は円状の空間をイメージし、その中に個々の数が書いてある図がイメージされますね。その定義域の集合Mの個々の要素から矢印が出ていて、値域の集合Nの個数の要素へと矢印が達している図がイメージされます。 この定義域なんですが、例えば0<x<6(ただし整数)とすると、要素は1、2、3、4、5の5個だけです。しかし、あらゆる参考書やサイトを見てみると、定義域内の任意の値としてのxも要素に含まれています。 つまり、上で言うなら6個になります。 でもやはり6個は明らかにおかしいので、xは定義域内の何かの値に重なっている(しかし、定義域内なら何でもよいし、瞬間ごとにxは重なる値を変える、つまり自由に動ける。)のでしょうか? だから例えば、上の定義域で、ある瞬間では 1、2、x、4、5 別の瞬間では 1、2、3、4、x というように動いていて、重なる値は何でもいいと考えました。 すると常に5個になります。 間違った考え方かもしれませんので、ご指摘お願いします。 まあ、定義域に制限がないときは、要素を書き出してもキリがないから、xが加わっても差し支えはありません。 また、下の写メにおいては、座標軸上の任意の点について考えてあります。 これは、明らかに任意の点Pは常に何かに重なっている(しかし何でもよい。自由に動ける。)と思います。なぜなら、Pは動けても、常に座標軸上のある点に存在しているのですから。 つまり、参考書やサイトにある、写像の定義域に含まれるx=xは何らかの値に重なっているのでしょうか? それとも、例えば要素が5個なら、xを足して6個になるのでしょうか? 要素が無限個なら差し支えはありませんが。 また、例えば定義域の集合において、1、2、xだけが書かれていたら(本当はもっと要素はあるが、要素を適当に書き出した。)、xは1、2以外の何かになるのでしょうか? もしxが1や2なら、集合内に同じ数が二つ含まれる事になり、おかしいですから。

  • 同一パッケージにあるクラスが見つからないエラー

    Tomcatとeclipseを用いてjspによるウェブアプリ開発の勉強をしているものです。 tagsrch.java内のメソッドに、同一パッケージ(フォルダ名:mangasearch)内のmangalist.javaで定義したmangaクラスというクラスを使いたいのですが、以下のように、シンボルが見つけられないというエラーが出てしまいます。 C:\(中略)\mangasearch>javac tagsrch.java tagsrch.java:11: エラー: シンボルを見つけられません public static List<manga> searchByKey(String k[]) throws IOException{ ^ シンボル: クラス manga 場所: クラス tagsrch tagsrch.java:14: エラー: シンボルを見つけられません manga[] list = new manga[cnum]; 同一パッケージ内に置かれている以上、tagsrch.javaにおいてmangaクラスが使えるはずだと思います。 ですが、いろいろなサイトを参考にして試してもmangaクラスが見つからないまま、tagsrch.javaがコンパイルできません。 初歩的質問で申し訳ありませんが、よろしくお願いいたします。 -参考- 1.いろいろ試したこと  1-1.カレントディレクトリを保存している場所より1つ上の場所でコンパイルする。  eclipseでtomcatプロジェクトを作成したため、どのクラスファイルにもpackage mangasearch;が含まれていました。なので1-1.を行い「javac パッケージ名/ファイル名」でコンパイルしてみました。  1-2.クラスパスを入れてコンパイルしてみる。  同一パッケージ内なので、この必要はないはずですが、  C:\(中略)\mangasearch>javac -classpath C:\(中略)\mangasearchでコンパイルしてみました。   下記のURLを参考にこの対策を講じましたが、エラーは変わりませんでした。  1-1.1-2.の参考URL:http://okwave.jp/qa/q2520327.html  1-3.メソッドをmangalist.java(mangaクラス)上で定義してしまう。  分割をあきらめ、tagsrch.java上のメソッドをmangalist.javaのmangaクラス上に定義してみました。 publicつけたままだと、 C:\(中略)\mangasearch>javac mangalist.java mangalist.java:76: エラー: クラスtagsrchはpublicであり、ファイルtagsrch.javaで宣 言する必要があります となったため、publicをとりました。するとコンパイルは出来ましたが、おそらく異なるパッケージからは使えないクラスとなったため、jsp上でアクセスできないというエラーが発生しました。 org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.IllegalAccessError: mangasearch/tagsrch このため、分割してtagsrch.javaを宣言する必要があり、1-3.の対策では最初にあげたmangaクラスを認識する問題に帰着すると思われます。 2.mangalist.java/tagsrch.javaについて mangalist.javaのコンパイルはできています。 mangalist.javaは、ただ単にmangaクラスとそれに付随するフィールド、コンストラクタを記述しただけのファイルです。 ■mangalist.java package mangasearch; class manga{ フィールド名 ・・・    manga(){    //コンストラクタ    } } ■tagsrch.java public class tagsrch extends manga{ メソッド{     } }

    • ベストアンサー
    • Java
  • EF(コードファースト)のコンテキストクラスの定義

    http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4codefirst01/ef4codefirst01_02.html こちらを参考にしてASP.net MVC + Entity Framework 4.1(コードファースト) のWebシステムを作ろうと考えています。 既存のDBを使用することを考えていて、DBに含まれるテーブル数は100弱となります。 それぞれのテーブルに対応するエンティティクラスを100弱定義し、これらを 登録するコンテキストクラスを作成しようと考えたのですが、 1.コンテキストクラスも100弱定義し、web.configの接続定義も100弱定義する。 2.コンテキストクラスは1つ定義し、その中に100弱のエンティティの定義をする。   web.configの接続定義は1つ定義する 上記の1、2のいずれが方向性として正しいものでしょうか? 2のほうがすっきりするとは思いますが、データ取得時にコンテキスト・クラスのインスタンスを 生成する際、余計なエンティティ定義も読み込まれるためパフォーマンスが悪いような気もします。 無視していいほど軽いのであれば、間違いなく2の方法を取るのですが…。

  • 整数論に関係する問題だと思います。

    整数論に関係する問題だと思います。 詳しい方、宜しくお願い致します。 n を3以上の整数とする. φn を整数 Z から集合 {1,・・・,n}への写像で, φn(a)=max{k∈{1,・・・,n} | k|n, k|a} で定義されるものとする. ただし a|b は a が b を割り切ることを表す. (eg. φ6(0)=6, φ6(1)=1, φ6(2)=2, φ6(3)=3, φ6(4)=2, φ6(5)=1, φ6(6)=6...) 次の主張は正しいでしょうか? 任意の a,b ∈ {1,・・・, n-1}に対し、 a と b が互いに素 ⇒ ある整数 i が存在し, φn(a+ib)=1を満たす.

  • クラスについて~根本的なことなんですが

    プログラムの経験はCOBOL程度で、 先月からJAVAの勉強を始めました。 プログラムを作成する上での機能や定義や、 サンプルプログラムの流れや処理内容を理解することは 出来てきたのですが、 実習問題で ・CheckDataクラスのCheckNumber()メソッドは、引数に渡された数値の 正負を判定し、正の場合trueを返します。 ・以下の実行結果になるようにプログラムを作成してください。 <実行例> -1 is a negative number. 2 is a positive number. -50 is a negative number. 100 is a positive number. <CheckData.java> public class CheckData { public boolean checkNumber(int data) { if (data >= 0) { return true; } else { return false; } } } <UsePackage.java> class UsePackage { public stativ void main(String args[]){ int num[] = {-1, 2, -50, 100}; } } <条件> ・確認する数値は、UsePackageクラスに定義されたnum配列の整数を使用する。 ・CheckDataクラスはhoge.pkglabsにパッケージする という問題が出たときに、 どちらのクラスに System.out.println(正負の表示); 等の処理を入れればいいのか、 どの処理は何処のクラスに入れればいいのか等が ちんぷんかんぷんです。 新たなクラスをファイルを作るべきなのかも分からなく、 実際上の問題で新たなクラスファイルを作ろうとしてました。 実際一から作る時が来るかと思いますが、その時を考えると 焦ってしまいます。 私がオブジェクト指向の考え方を分かったつもりで、 実は正しく理解出来ていないのかもしれません。 Javaを習い始めた時に同じ問題にぶつかった方、 乗り越えた方がいらっしゃいましたら、 是非その勉強法(?)、クラスやプログラムの組み方を教えていただきたいのです。 宜しくお願いします。

    • ベストアンサー
    • Java
  • 抽象クラスを継承してクラスを作成の作り方が分かりません

    -------------------------------------- Employee -------------------------------------- -name : String #coin:double -------------------------------------- +getName():String +setName(String name):void +getcoin():double +setcoin(double Salary):void -------------------------------------- 抽象クラスを継承してクラスを作成 car1.java car2.java Employee.javaはIEmployeeを継承 IEmployee.javaは、メソッド"String getRoleName()を定義するインターフェース IEmployee.javaも作成 Sample.javaを実行し次の結果を得られるように作成 どなたか分かる方がいましたら教えて下さい。宜しくお願いします。

  • 抽象クラスからオーバーライドについて

    EclipseでJavaを勉強始めました。 抽象クラスからオーバーライドするところで質問致します。 抽象クラスとして、「面積を計算する」というメソッドをもつDiagramクラスを定義しました。それを継承して、「四角形の面積を計算する」というメソッドをもつSquareクラスと、「三角形の面積を計算する」というメソッドをもつTriangleクラスを定義しました。 Squareクラス、Triangleクラスからインスタンスを生成して、四角形、三角形の面積をコンソールに表示させるという簡単なプログラムです。 このとき、main関数と3つのクラスの関係についてお尋ねします。 (1)iagram.java、Square.java、Triangle.javaそれぞれにクラス定義とmain関数を持たせるパターン public abstract class Diagram { // 面積計算定義(抽象メソッド) public static void main(String[] args) { } } public class Square extends Diagram{ //四角形の面積の計算定義 public static void main(String[] args) { //四角形の面積の計算と表示 } public class Triangle extends Diagram{ //三角形の面積の計算定義 public static void main(String[] args) { //三角形の面積の計算と表示 } (2)sample.javaというファイルにまとめ、その中にこの3つのクラス定義とmain関数を一つ持たせるパターン public class sample { public static void main(String[] args) { //四角形の面積の計算と表示 //三角形の面積の計算と表示 } } abstract class Diagram { // 面積計算(抽象メソッド)定義 } class Square extends Diagram{ //四角形の面積の計算定義 } class Trapezoid extends Diagram{ //三角形の面積の計算定義 } この二通りを考えて、どちらも実行できたのですが、どちらの方がJavaらしいプログラムと思われますでしょうか?

    • ベストアンサー
    • Java