Nous savons que pour implémenter l'addition, nous devons utiliser des symboles arithmétiques, alors comment pouvons-nous réaliser une addition sans utiliser de symboles arithmétiques ? Aujourd'hui, l'éditeur présentera comment implémenter l'addition sans utiliser les opérateurs d'addition, de soustraction, de multiplication et de division. Vous pouvez vous y référer si vous en avez besoin.
Écrivez une fonction pour trouver la somme de deux entiers Il est obligatoire que les quatre symboles arithmétiques "+", "-", "*" et "/" ne soient pas utilisés dans le corps de la fonction.
Exemple :
输入: a = 1, b = 1 输出: 2
Conseils :
a, b peuvent être négatifs ou 0 et le résultat ne dépassera pas l'entier de 32 bits
Idée de solution 1
fonction Array_sum
Code
class Solution { /** * 递归法 * @param Integer $a * @param Integer $b * @return Integer */ function add($a, $b) { // return bcadd($a, $b); // bc 系列函数 return array_sum([$a, $b]); }}
Idée de solution 2 - Avec l'aide des opérations au niveau du bit
il est préférable de mémoriser la question sur les calculs au niveau du bit. Après tout, l'utilisation de l'addition simulée comme les opérations au niveau du bit n'est fondamentalement que cette question, et elle est facile à oublier. . . . .
^ Ou - équivalent à la sommation sans carry, imaginez la situation de simulation en base 10 : (par exemple : 19 + 1 = 20 ; la somme sans carry est 10, pas 20 ; car elle ne se soucie pas de la situation de carry)
& et —— équivalent à trouver le numéro de report pour chaque bit. Regardons d'abord la définition : 1 & 1 = 1 ; 1 & 0 = 0 ; c'est-à-dire qu'il vaut 1 uniquement lorsque les deux sont ; 1, qui peut être simulé Quant au numéro de report, imaginez la situation de simulation en base 10 : (9 + 1 = 10. Si vous utilisez & idée pour le gérer, le numéro de report obtenu par 9 + 1 est 1, pas 10, alors utilisez < <1 Déplacez-vous d'un endroit de plus vers la gauche, cela devient donc 10
La formule est : (a^b) ^ ((a&b)<<1) C'est-à-dire : trouver + à chaque fois ); sans report Le numéro de report obtenu - nous devons répéter ce processus jusqu'à ce que le numéro de report soit 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; // }}
Idée de résolution de problème 3 - Calcul petit à petit
Le principe est équivalent au fonctionnement du bit, juste manuellement bit Implémentation de l'opération
code
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 = ''; $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; }}
Apprentissage recommandé :Tutoriel vidéo php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!