假设,有3个整数变量:
$n1 = 8559800019119; 
$n2 = 99901;
$n3 = 911861;
$result = ????????;  // 如何将3个整数变成一个整数,并在以后能还原成这3个整数//--------------------$r = ??????($result); // 如何这个整数,还原成3个整数
$r1 = 8559800019119;
$r2 = 99901;
$r3 = 911861;这3个整数如何处理,才能变成一个数字,并且在其它页面里接收到它,并还原成这3个整数?只能用数学运算,不能拼接成字符串或数组

解决方案 »

  1.   

    整数的第一位不能为0 可以把每个整数都换成可以解读的字符串 比如 $n1 = 8559800019119 换成 $n1n = strlen($n1)"0".$n1; 然后在把所有的字符串链接成一个长字符 例如 $str = strlen($n1)"0".$n1.strlen($n2)"0".$n2.strlen($n3)"0".$n3;解读这个长字符就可以了 
    思路大体就是  获取这个字符后  截取第一个"0"之前的数字(你需要的第一整数的位数)  得到这个位数后第一个"0"后这些个位数后就是第一个整数了 再把这些字符截除,依次递归 就会得到所有的整数了
    这是方法:    function sub($str, &$arr = [])
        {
            // 第一个整数的长度
            $lenght = substr($str, '0', strpos($str, '0'));
            // 取出第一整数
            $number = substr($str, strpos($str, '0')+1, $lenght);
            // 判断剩余字符的第一个字符是否为0
            for ($i=0; $i<strlen($number); $i++) {
                if ($number[0]==0) {
                    $lenght *= 10;
                    $number = substr($str, strpos($str, '0')+1+($i+1), $lenght);
                    // 截取除去第一数字剩余的字符串位数
                    $surplus_num = $lenght+strpos($str, '0')+1+($i+1)-strlen($str);
                    $str = substr($str, $lenght+strpos($str, '0')+1+($i+1)-strlen($str));
                } else {
                    if ($i == 0) {
                        // 截取除去第一数字剩余的字符串位数
                        $surplus_num = $lenght+strpos($str, '0')+1-strlen($str);
                        $str = substr($str, $lenght+strpos($str, '0')+1-strlen($str));
                    }
                    break;
                }
            }
            // 获取整数
            array_push($arr, $number);
            // 递归
            if ($surplus_num) {
                $this->sub($str, $arr);
            }
            return $arr;
        }
            $n1 = 8000000001;
            $n2 = 9990111;
            $n3 = 91186122;
            $result = [$n1, $n2, $n3, 111, 211];
            $str = '';
            foreach ($result as $item) {
                $str = $str.strlen($item).'0'.$item;
            }
            // 调用递归函数
            var_dump($this->sub($str));
      

  2.   

    8559800019119 有 13 位,已经超出 php 可表示的整数范围了
    除非你使用的是 64位php由于前题存在不确定性,所以不会有肯定的答案不过
    8559800019119999019118611305063
    3130506855980001911999901911861
    都可以作为备选
      

  3.   

    类似于 rsa 的加密方法。 e ,d ,m关系加密再解密。
    在计算机处理整数的范围里,更简单的 就用   y=ax+b  一个代数式也能解决问题。
      

  4.   

    先获取三个整数的长度,三个整数可以拼接成一个很大的整数,需要获取的时候可以截取之前字符的长度。
    <?php  $n1 = 8559800019119; 
    $n1_s = strlen($n1);
    $n2 = 99901;
    $n2_s = strlen($n2);
    $n3 = 911861;
    $n3_s = strlen($n3);
    $result = $n1.$n2.$n3; echo $result;
    echo "<br>";
    $n1 = substr($result,0,$n1_s);
    echo $n1;
    echo "<br>";
    $n2 = substr($result,$n1_s,$n2_s);
    echo $n2;
    echo "<br>";
    $n3 = substr($result,$n1_s+$n2_s);
    echo $n3;
    echo "<br>";