ホームページ  >  記事  >  バックエンド開発  >  加算、減算、乗算、除算の記号を使用せずに PHP で加算を実装する方法

加算、減算、乗算、除算の記号を使用せずに PHP で加算を実装する方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-07-09 15:05:372034ブラウズ

加算を実装するには算術記号を使用する必要があることはわかっていますが、算術記号を使用せずに加算を実装するにはどうすればよいでしょうか?今回は、加減乗除演算子を使わずに足し算を実装する方法をエディターが紹介しますので、必要な方は参考にしてください。

加算、減算、乗算、除算の記号を使用せずに PHP で加算を実装する方法

2 つの整数の合計を求める関数を作成してください。4 つの算術記号 " "、"-"、"*"、および "/" は使用できません。関数本体で使用できます。

例:

输入: a = 1, b = 1
输出: 2

ヒント:

a、b は負または 0 であっても、結果は 32 ビット整数をオーバーフローしません

# #問題を解決する アイデア 1

array_sum 関数

コード

class Solution {
    /** 
    * 递归法 
    * @param Integer $a 
    * @param Integer $b 
    * @return Integer 
    */
    function add($a, $b) {
        // return bcadd($a, $b); // bc 系列函数
        return array_sum([$a, $b]);
    }}

解決策のアイデア 2 - ビット演算の助けを借りて

この質問ビット 演算は覚えておいたほうが良いです 結局のところ、ビット演算のアナログな加算の使い方は基本的にこの質問だけなので、すぐに忘れてしまいます。 。 。 。 。

#^ または - キャリーなしの合計と同等で、基数 10 でのシミュレーション状況を想像してください: (例: 19 1 = 20; キャリーなしの合計は 20 ではなく 10 です。キャリーの状況は関係ないため)

& と - は、各ビットのキャリー数を見つけるのと同じです。まず定義を見てください: 1 & 1 = 1; 1 & 0 = 0; 0 & 0 = 0; つまり、両方が1 は 1 だけで、キャリー数の状況をシミュレートすることも、10 進数でシミュレーション状況を想像することもできます: (9 1 = 10、& の考えで処理すると、キャリー数が得られます) by 9 1 は 1 であり、10 ではありません。したがって、<<1 を使用して 1 位置左に移動すると、10 になります);

式は次のとおりです: (a^b) ^ ((a&b) <<1) つまり: キャリーなしで毎回キャリーの数を見つけます - キャリーの数が 0 になるまでこのプロセスを繰り返す必要があります;

Code

class Solution {
    /** 
    * 递归法 
    * @param Integer $a 
    * @param Integer $b 
    * @return Integer 
    */
    function add($a, $b) {
        if ($b == 0) {
            return $a;
        }
        return $this->add($a ^ $b, ($a & $b) << 1);
    }
    // 迭代法
    // function add($a, $b) {
    // while ($b != 0) {
    // $temp = $a ^ $b;
    // $b = ($a & $b) << 1;
    // $a = $temp;
    // }
    // return $a;
    // }}

問題解決のアイデア 3 - ビット単位の計算

原理はビット演算と同等ですが、手動ビット演算の実装

コード

class Solution {
    /** 
    * 此方法暂时只支持两个正数相加 
    * @param Integer $a 
    * @param Integer $b 
    * @return Integer 
    */
    function add($a, $b) {
        $a = "$a";
        $b = "$b";
        $lenA = strlen($a);
        $lenB = strlen($b);
        $res = &#39;&#39;;
        $flag = 0;   // 进位标志
        for ($i = $lenA - 1, $j = $lenB - 1; $i >= 0 || $j >= 0; $i--, $j--) {
            // 超出的位数用 0 表示
            $itemA = ($i >= 0) ? $a[$i] : 0;
            $itemB = ($j >= 0) ? $b[$j] : 0;
            // 求位数和
            $sum = (int)$itemA + (int)$itemB + $flag;
            // 是否进位
            if ($sum >= 10) {
                $flag = 1;  // 只可能为1
                $sum = $sum - 10;
            } else {
                $flag = 0;
            }
            
            $res = $sum . $res;
        }
        // 处理最高位进位
        return $flag > 0 ? $flag . $res : $res;
    }}

推奨学習:

php ビデオ チュートリアル

以上が加算、減算、乗算、除算の記号を使用せずに PHP で加算を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はhxd.lifeで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。