今年3月份的面试颇受挫折,被多位面试官“蹂躏”。 其中有次,面试不太理想,面试官就给了最后一次机会是几道ACM算法竞赛的题,是大数相加,大数相减,大数相乘,大数相除;遗憾的是,最后仅勉强做出大数相乘。 今天又遇到类似的问题,所以就趁机先把大数相加的代码,写出来,回头补上其他几个运算。
<?php
$str = '00000000123123123123342425345344353453459999999';
$str2 = '3242567999999999999999999999999999999990';
// 函数验证
var_dump(strAdd($str, $str2));
// 通过PHP内置bcadd验证结果
var_dump(bcadd($str,$str2));
function strAdd($str = '', $str2 = '')
{
if (strlen($str) > strlen($str2)) {
// 将较短的数组左侧添加0, 将两个数组长度相同
$str2 = str_pad($str2, strlen($str), '0', STR_PAD_LEFT);
$count = strlen($str);
} else {
$str = str_pad($str, strlen($str2), '0', STR_PAD_LEFT);
$count = strlen($str2);
}
// 初始化一个比最长数组长度多1位的一个数组,存放计算结果
// 从开头填充0
$sum = array_fill(0, $count, 0);
// 根据计算习惯,从数组的最后一位,即字符串的最左端开始计算
for ($i = $count - 1; $i >= 0; $i--) {
// 由于php里,字符串可以直接当做数组处理,所以不必再分割
// 将两个数字的对应位相加,累加到对应结果位上(不用赋值是因为下面可能有进位)
$sum[$i] += $str[$i] + $str2[$i];
// 如果大于10需要进位
if($sum[$i] >= 10) {
$sum[$i] -= 10;
$sum[$i - 1] += 1;
}
}
// 去除前导0
foreach ($sum as $key => $value) {
if($value == 0) {
unset($sum[$key]);
} else {
break;
}
}
return implode('', $sum);
}