diff --git a/problems/cpp/minimum-flips-to-make-a-or-b-equal-to-c.cpp b/problems/cpp/minimum-flips-to-make-a-or-b-equal-to-c.cpp new file mode 100644 index 0000000..02c9187 --- /dev/null +++ b/problems/cpp/minimum-flips-to-make-a-or-b-equal-to-c.cpp @@ -0,0 +1,38 @@ +#include +#include + +class Solution { +public: + int minFlips(int a, int b, int c) + { + auto flips = 0; + + for (; (a | b) != c; a >>= 1, b >>= 1, c >>= 1) { + auto [aa, bb, cc] = std::tuple { a & 1, b & 1, c & 1 }; + + if ((aa | bb) == cc) { + continue; + } + + if (aa && bb) { + flips += 2; + } else { + flips++; + } + } + + return flips; + } +}; + +int main() +{ + Solution s; + + assert(s.minFlips(2, 6, 5) == 3); + assert(s.minFlips(4, 2, 7) == 1); + assert(s.minFlips(1, 2, 3) == 0); + assert(s.minFlips(8, 3, 5) == 3); // 1000 | 0011 = 0101 + + return 0; +}