<?php
$arr = [2, 1, 7, 4, 3, 10, 8, 6,9,18,76];
echo json_encode(getRes($arr));exit;
function getRes($arr) {
if (empty($arr)) {
return [];
}
$len = count($arr);
for ($j=$len-1; $j>0; $j--) {
heapAdjust($arr, $j);
swap($arr[0], $arr[$j]);
}
//这一步很关键,因为上面多交换了一次
swap($arr[0], $arr[$j+1]);
return $arr;
}
function heapAdjust(& $arr, $end) {
$start = intval(($end-1)/2);
for ($i=$start; $i>=0; $i--) {
if (2*$i+1 < $end) {
if ($arr[$i] < $arr[2*$i+2]) {
swap($arr[$i], $arr[2*$i+2]);
}
}
if (2*$i+1 < $end) {
if ($arr[$i] < $arr[2*$i+1]) {
swap($arr[$i], $arr[2*$i+1]);
}
}
}
}
function swap( & $a, &$b) {
$tmp = $a;
$a = $b;
$b = $tmp;
}
exit;
//求解2^1000
//2^10
var_dump(getRes1(125, 2));
function getRes1($num1, $num2) {
if ($num1 == 0 || $num2 == 0) {
return 0;
}
//123
//456
$str1 = strrev(strval($num1));
$str2 = strrev(strval($num2));
$flag = 0;
$len1 = strlen($str1);
$len2 = strlen($str2);
$sum = [];
for($i=0; $i<$len1;$i++) {
$value = 0;
for($j=0; $j<$len2;$j++) {
$val1 = $str1[$i] ?? 1;
$val2 = $str2[$j] ?? 1;
if ($val1 * $val2 + $flag >= 10) { //需要进位
$tmp = $val1 * $val2 + $flag;
$flag = intval($tmp/10);
$value = $value*10 + $tmp%10;
} else {
$value = $value*10 + $val1 * $val2 + $flag;
$flag = 0;
}
var_dump($value, $i, $j, '-----');
}
$sum[] = strrev($value);
}
$res = $sum[0];
for($i=1; $i<count($sum); $i++) {
$res = getSum($res, $sum[$i]. '0');
}
return $res;
}
function getSum($num1, $num2) {
$str1 = strrev(strval($num1));
$str2 = strrev(strval($num2));
$flag = 0;
$len1 = strlen($str1);
$len2 = strlen($str2);
$sum = 0;
$i = 0;
$j = 0;
while($i<$len1 || $j < $len2) {
$val1 = $str1[$i] ?? 0;
$val2 = $str2[$j] ?? 0;
if ($val1 + $val2 + $flag >= 10) { //需要进位
$tmp = $val1 + $val2 + $flag;
$flag = intval($tmp/10);
$sum += $tmp%10;
} else {
$sum += $val1 + $val2 + $flag;
$flag = 0;
}
$sum *= 10;
$i++;
$j++;
}
return strrev(strval($sum));
}