3

a % b2 つの非常に大きな数を計算する必要があります。abが よりも大きいため、デフォルトのモジュロ演算子を使用できませんPHP_INT_MAX。したがって、それらを「文字列」として処理する必要があります。

BCorのような特別な数学ライブラリが存在することは知っていますがGMP、これらが有効になっていない共有ホストでアプリがホストされる可能性があるため、それらを使用することはできません。仕事をする関数をphpで書く必要があります。この関数は 2 つの文字列 (2 つの数値) をパラメーターとして受け取り、 を返す必要がありa % bますが、開始方法がわかりません。この問題を解決するには?

4

4 に答える 4

3

PHP 4.0.4 以降、libbcmath は PHP にバンドルされています。この拡張機能には外部ライブラリは必要ありません。これらの関数は、PHP が --enable-bcmath で構成されている場合にのみ使用できます。

Windows バージョンの PHP には、この拡張機能のサポートが組み込まれています。これらの機能を使用するために追加の拡張機能をロードする必要はありません。これらの機能は、ホスティング会社側のアクションなしで、自分で有効にできるはずです。

于 2012-12-16T17:50:27.120 に答える
2

私はこの解決策について考えました: $n は巨大な数を表し、 $m は (それほど大きくない) モジュラスを表します。

function getModulus($n, $m)
{
    $a = str_split($n);
    $r = 0;

    foreach($a as $v)
    {
        $r = ((($r * 10) + intval($v)) % $m);
    }

    return $r;
}

それが誰かを助けることを願って、

于 2014-02-06T16:40:38.573 に答える
1

プロセッサによっては、64 ビット マシンを使用している場合は 2^63-1、32 ビット マシンを使用している場合は 2^31-1 で、マシンが計算できる 10 進数の長さが得られます。それを超えると、間違った値が得られます。番号をチャンクに分割することで、同じことができます。例: 私の番号は 10 進法で 18 であるため、9/7/2 = 18 のチャンクに分割されます。最初のチャンクの mod を計算します。最初の mod を 2 番目のチャンクの前に追加します。例: 最初の mod = 23 の結果、したがって 23XXXXXXX。結果の 23XXXXXXX の mod を見つけます。mod を最後のチャンクに追加します。例: mod = 15 の場合は 15XX。

$string = '123456789123456789'; // 18 decimal long
$chunk[0] = '123456789'; // 9 decimal long
$chunk[1] = '1234567'; // 7 decimal long
$chunk[2] = '89'; // 2 decimal long
$modulus = null;
foreach($chunk as $value){
$modulus = (int)($modulus.$value) % 45;
}

上記の $modulus の結果は、

$modulus = $string % 45 偶数より遅い方が良い。これが役立つことを願っています。同様のアプローチを持つ人はいますか?

于 2014-01-12T12:15:10.637 に答える
0

fmodより大きい値に使用できますMAX_INT

詳しくはこちら

http://php.net/manual/en/function.fmod.php

于 2012-12-16T17:49:14.037 に答える