首页 > 试题广场 >

大数相减

[编程题]大数相减
  • 热度指数:1213 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

数据范围:两个数字的长度都满足 ,数字中仅包含 ,第一位不可能是0
示例1

输入

"100000000","1"

输出

"99999999"
示例2

输入

"100000000","1000000000"

输出

"-900000000"
<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num1 string字符串 
 * @param num2 string字符串 
 * @return string字符串
 */
function substring( $num1 ,  $num2 )
{
    // write code here
    $r1 = strlen($num1);
    $r2 = strlen($num2);
    $isZ = true;//相减是否是正数
    if($r1<$r2){
        $isZ = false;
        $tmp = $num1;
        $num1 = $num2;
        $num2 = $tmp;
        $r1 = $r1^$r2;
        $r2 = $r1^$r2;
        $r1 = $r1^$r2;
    }else if($r1 === $r2){
        if($num1 === $num2)return 0;
        for($i = 0;$i < $r1;$i++){
            if($num1[$i] === $num2[$i]){
                continue;
            }
            if($num1[$i] > $num2[$i]){
                break;
            }else{
                $isZ = false;
                $tmp = $num1;
                $num1 = $num2;
                $num2 = $tmp;
                break;
            }
        }
    }
    $resStr = '';
    $add = 0; //进位
    $i = 1;
    while( $r1 >= $i ){
        $value = (int) $num1[-$i] + $add; //被减数
        $diff = 0;  //减数
        if(isset($num2[-$i])){
            $diff = (int) $num2[-$i];
        }
        if($value < $diff){
            $value += 10;
            $add = -1;
        }else{
            $add = 0;
        }
        $resStr = ($value - $diff).$resStr;
        $i++;
    }
    return $isZ?ltrim($resStr,'0'):'-'.ltrim($resStr,'0');
}


发表于 2024-04-30 16:35:03 回复(0)