在 C++ 中查找通过删除数字中最少位数形成的最大立方体
概念
对于给定的数字 N,我们的任务是确定可以通过删除数字中最少位数(可能是 0)形成的最大完全立方体。因此,可以从给定数字中删除任何数字以达到目标。
如果 A = B^3 对于某个整数 B,则 A 被称为完全立方体。
如果数字不能是完全立方体,则打印 -1。
示例
令 N = 1025。可以看出,如果我们从上述数字中删除 0,我们将得到 125 作为剩余数字,它是 5 的立方根(5 * 5 * 5 = 125)。
令 N = 806。可以看出,如果我们删除 0 和 6,则我们将得到 8 作为剩余数字,它是 2 的立方根(2 * 2 * 2 = 8)
方法
我们必须检查数字的每个子序列,检查该数字是否为立方体,然后将其与其中的最大立方体进行比较。为了创建所有子字符串,我们删除最后一个字符,以便可以创建下一个排列。
所以我们有一个数字 num = "876",之后我们将每个元素添加到当前字符串中,这将给我们 -
8 87 876
在此之后,递归将返回 "87",然后删除 '7' 并调用下一个迭代,这将给出子序列 "86"。因此,这将完成 '8' 的递归,子序列将从 '7' 开始,这将给出 "7" 和 "76",之后是 "6"。
结果,这将给出给定数字 876 的所有子序列。
示例
#include <bits/stdc++.h> using namespace std; #define ll long long ll mx1 = INT_MIN; bool is_Cube(ll x1){ int found = 0; for (int i = 2; i <= (x1 / 2); i++){ if (x1 % i == 0){ if ((i * i * i) == x1) found = 1; } } if (found == 1) return true; else return false; } void printSubSeqRec(string str, int n1, int index = -1, string curr1 = ""){ if (index == n1) return; if (curr1 != ""){ ll temp = stoi(curr1); if (is_Cube(temp)) mx1 = max(mx1, temp); } for (int i = index + 1; i < n1; i++){ curr1 += str[i]; printSubSeqRec(str, n1, i, curr1); curr1 = curr1.erase(curr1.size() - 1); } return; } int main(){ int nums1 = 1025; string str1 = to_string(nums1); printSubSeqRec(str1, str1.size()); if (mx1 != INT_MIN) cout << mx1; else cout << "NOT FOUND ANY CUBE"; return 0; }
输出
125
广告