2017-01-02 59 views
0

輸入將由許多數字對組成,每個數字對在一條單獨的行上,數字之間用逗號分隔。這些數字可以長達100位數字。數字將是整數,派系數字和負數不會被輸入。輸入將在文件結束時終止。如何獲得整數輸出?

輸出將是各自在各自獨立行上的反轉和。對於每個輸入對,應該有一個反轉和。

我這個寫這個代碼,但不能給出正確的結果爲整數值

$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

預期輸出: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

在PHP中的所有數限制在系統WORD大小,即32位(PHP_INT_MAX = 2147483647)或64位(PHP_INT_MAX = 9223372036854775807)。任何評估爲大於此限制的數字都將轉換爲浮點小數。

考慮使用bcmath時,其存儲在十進制數(人類可讀的)形式的,而不是在二進制形式,作爲字符串,所以它們實際上可以是無限長:

$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

我不知道如何根據您提供的代碼來達到您的預期產出。我也不明白你爲什麼要去掉零。 (也許你想使用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

我猜你在做什麼是某種形式的鍛鍊,因爲我有沒有你爲什麼要這樣做線索輸出,但這應該工作。