在 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

更新於: 2020-07-23

117 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.