C++ 中将二进制数约简为 1 的步骤

c++server side programmingprogramming

假设我们有一个二进制数 s。我们需要根据以下规则求出将其约简为 1 的步骤数 −

  • 如果当前数为偶数,则将其除以 2。

  • 如果当前数为奇数,则为其加 1。

因此,如果输入为"1101",则输出为 6,因为"1101"是 13。所以,13 是奇数,加 1 得到 14。然后 14 是偶数,除以 2 得到 7。之后 7 是奇数,加 1 得到 8。

然后 8 又是偶数,除以 2 得到 4。4 又是偶数,除以 2 得到 2,最后 2 是偶数,除以 2 得到 1。

为了解决这个问题,我们将遵循以下步骤 −

  • 定义一个函数 addStrings(),它将接受一个数组 num1 和一个数组 num2,

  • 定义一个数组 ret

  • 进位 := 0,和 := 0

  • 反转 num1 和 num2

  • i := 0, j := 0

  • 当 (i < num1 的大小或 j < num2 的大小) 时,执行 −

    • 如果 i < num1 的大小且 j < num2 的大小,则执行 −

      • sum := carry + (num1[i] + num2[j])

      • 在 ret 末尾插入 sum mod 2

      • carry := sum / 2

      • (i 加 1)

      • (j 加 1)

    • 否则,当 i < num1 的大小,然后减去 num1 的大小

      • sum := carry + (num1[i])

      • 在 ret 末尾插入 sum mod 2

      • carry := sum / 2

      • (将 i 加 1)

    • 否则

      • sum := carry + (num2[j])

      • 在 ret 末尾插入 sum mod 2

      • carry := sum / 2

      • (将 j 加 1)

  • 如果进位非零,则 −

    • 在 ret 末尾插入进位

  • i := ret 的大小

  • ans := 空字符串

  • 如果 i >= 0,则更新(将 i 减 1),并执行 −

    • ans := ans + (ret[i] + '0' 的 ASCII 码)

  • 返回(如果 ans 的大小与 0 相同,则返回 "0",否则返回 ans)

  • 定义一个函数 addBinary(),该函数接受一个数组 a、一个数组b,

  • 返回 addStrings(a, b)

  • 定义一个数组 makeVector 并从 v 复制

    • 定义一个数组 ret

    • 初始化 i := 0,当 i < v 的大小时,更新(将 i 加 1),执行 −

      • 在 ret 末尾插入 v[i] - ASCII 值为 '0'

    • return ret

  • 在主方法中执行以下操作:

  • ret := 0

  • 定义一个数组 x = makeVector from s

  • 当 x 的大小 > 1 时,执行 −

    • (将 ret 增加 1)

    • 如果 x 的最后一个元素等于 0,则执行 −

      • 从 x 中删除最后一个元素

    • 否则

      • 定义一个大小为 1 的数组 temp

      • temp[0] := 1

      • x := makeVector(addBinary(x, temp))

  • return ret

示例

让我们看看下面的实现以便更好地理解 −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   string addStrings(vector<int> num1, vector<int> num2){
      vector<int> ret;
      int carry = 0;
      int sum = 0;
      reverse(num1.begin(), num1.end());
      reverse(num2.begin(), num2.end());
      int i = 0;
      int j = 0;
      while (i < num1.size() || j < num2.size()) {
         if (i < num1.size() && j < num2.size()) {
            sum = carry + (num1[i]) + (num2[j]);
            ret.push_back(sum % 2);
            carry = sum / 2;
            i++;
            j++;
         }
         else if (i < num1.size()) {
            sum = carry + (num1[i]);
            ret.push_back(sum % 2);
            carry = sum / 2;
            i++;
         }
         else {
            sum = carry + (num2[j]);
            ret.push_back(sum % 2);
            carry = sum / 2;
            j++;
         }
      }
      if (carry)
         ret.push_back(carry);
      i = ret.size() - 1;
      string ans = "";
      for (; i >= 0; i--)
         ans += (ret[i] + '0');
      return ans.size() == 0 ? "0" : ans;
   }
   string addBinary(vector<int>& a, vector<int>& b){
      return addStrings(a, b);
   }
   vector<int> makeVector(string v){
      vector<int> ret;
      for (int i = 0; i < v.size(); i++)
         ret.push_back(v[i] - '0');
      return ret;
   }
   int numSteps(string s){
      int ret = 0;
      vector<int> x = makeVector(s);
      while (x.size() > 1) {
         ret++;
         if (x.back() == 0) {
            x.pop_back();
         }
         else {
            vector<int> temp(1);
            temp[0] = 1;
            x = makeVector(addBinary(x, temp));
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.numSteps("1101"));
}

输入

"1101"

输出

6

相关文章