2017-01-02 8 views
0

入力は多数の数字のペアで構成され、それぞれが別々の行にあり、数字はコンマで区切られます。数字は100桁の長さにすることができます。数字は整数と派閥番号で、負の数字は入力されません。入力はファイルの終わりで終了します。どのように出力を整数として取得しますか?

出力は、それぞれの行ごとに逆の合計になります。各入力ペアについて、逆の合計が1つ存在する必要があります。

私はこれにこのコードを書いていますが、ではない整数値として、正しい結果が得られ

$number="36222813552166588601325554186418874001226412488844274840066661514,32814873748120642422248240335447 
"; 
$int_array = array_map("intval", explode(",", $number)); 

$sum=0; 
foreach($int_array as $item) 
{ 
    $sum=$sum+strrev($item);   
} 
$reverse_sum=str_replace("0","",strrev($sum)); 
echo $reverse_sum; 

ガット出力:91+E562719451714.1

予想される出力:PHPで68046696201386131133563894412955974001226412488844274840066661514

+3

数値がすべて32ビットまたは64ビット精度以上の大きな整数の場合は、[bcmath](http://php.net/manual/en/book.bc.php)または[ gmp](http://php.net/manual/en/book.gmp.php) –

+2

なぜ3つのバージョンのPHPがタグ付けされていますか?あなたはどちらを使っていますか? – KhorneHoly

+0

7.1.0 @KhorneHoly – Thericir41

答えて

2

すべての数字は、システムに制限されていますWORDサイズ、すなわち32ビット(PHP_INT_MAX = 2147483647)または64ビット(PHP_INT_MAX = 9223372036854775807)。この制限を超えて評価された数値は、浮動小数点の10進数に変換されます。

$input = "36222813552166588601325554186418874001226412488844274840066661514,32814873748120642422248240335447"; 
$numbers = explode(",", $input); 
$sum = "0"; 
foreach($numbers as $num){ 
    $sum = bcadd($sum, $num); 
} 

$reversed = str_replace("0", "", strrev($sum)); 
echo $reversed; 

出力:169699638879668496611618698146814555231688566125531822263

が文字列として、小数点以下の数字を格納BCMath、(人間が読める)形式の代わりにバイナリ形式でを使用して、それらは事実上無限に長くなることが検討

あなたが提供したコードに従って予想される出力にどのように届くかわかりません。なぜゼロを取り除くのか分かりません。 (たぶん、あなたは代わりにltrim(strrev($sum), "0")を使用したい?結果は、あなたがいずれかを探していることになるものではありませんこれは、16969960388079668490606100161860981468145552310688566125531822263だろう。

あなたは小数を持っている場合は、あなたの入力に四番目のパラメータを追加することを検討。

0

あなたはBCMath、またはGMPを使用することができますどちらかが必要な拡張機能をインストールするためにあなたを必要とする例えば、GMPでそれをやって:。。

$number="36222813552166588601325554186418874001226412488844274840066661514,32814873748120642422248240335447"; 
$int_array = explode(",", $number); 

$sum = 0; 
$gmp_sum = gmp_init('0'); 

foreach($int_array as $item) 
{ 
     $gmp_sum = gmp_add($gmp_sum, strrev($item)); 
     $sum  = $sum+strrev($item); 
} 
$original_reverse_sum = str_replace("0","",strrev($sum)); 
$gmp_reverse   = str_replace("0", "", strrev(gmp_strval($gmp_sum))); 

echo "Original Reverse Sum: $original_reverse_sum \n"; 
echo "GMP result: $gmp_reverse\n"; 

出力:

オリジナルリバース合計:46 + E74846666151.4

GMP結果:私はあなたがこの種のをしたいですかなぜのか見当もつかないので68466962138613113356389441295597412264124888442748466661514

私はあなたが何をしているかを推測するには、運動のいくつかの並べ替えですこれはうまくいくはずです。

関連する問題