全数字产品


给定两个数字,我们的任务是确定给定数字是否由另外两个数字相乘得到,并且这三个数字组合在一起构成一个 9 位全数字。

换句话说,我们可以说我们需要找出给定数字在与另外两个数字组合后(相乘得到原数字)是否为全数字。

对于这个问题,我们可能有许多这样的情况,会得到多个解。为了获得最佳时间复杂度,我们将只打印找到的第一个解并停止迭代过程。

解决方案:让我们首先讨论什么是全数字:

只有当一个 n 位数使用从 1 到 n 的所有数字且每个数字只使用一次时,它才能被称为全数字。即,该数字可以用从 1 到 n 的所有数字的排列表示,每个数字只使用一次。

例如,6745312 是一个 7 位全数字,因为它使用了从 1 到 7 的所有数字。

现在让我们用一些例子来理解这个问题:

Given Number: 7254
Result obtained: Yes, the condition is true

众所周知,7254 可以表示为 39 和 186 的乘积。

组合 39、186 和 7254 后,我们得到 391867254,它包含从 1 到 9 的所有数字,每个数字只使用一次,即它是 9 位全数字。

Given Number: 6952
Result obtained: Yes, the condition is true

方法

现在,让我们讨论解决这个问题的方法:

我们将首先找出所有相乘结果为待检查数字的数字对。然后,对于每对可能的解,我们将创建一个字符串,并存储所有三个数字(原始数字及其两个因数,相乘得到该数字)。

现在让我们看看我们解决方案的工作算法。

  • 步骤 1 - 迭代循环以检查数字的所有因数对。

  • 步骤 2 - 对于每个因数对,我们将创建一个包含原始数字和两个因数的字符串。

  • 步骤 3 - 使用 sort() 函数对生成的字符串进行排序。

  • 步骤 4 - 现在我们将创建另一个字符串“123456789”。

  • 步骤 5 - 比较这两个字符串,如果两者相同,则返回 true。

示例

此方法的代码如下:

#include <bits/stdc++.h>
using namespace std;

// this function checks whether the given string consist of pandigital numbers
bool Is_Pandigital_product (string Original_string) {
   if ( Original_string.length() != 9 ) {
      return false;
   }
   char c[Original_string.length()];
   strcpy(c, Original_string.c_str());
   sort(c, c + Original_string.length());
   string new_string = c;
   if(new_string.compare("123456789") == 0) // comparing both the strings
   {
      return true;
   } else {
      return true;
   }
}
bool PandigitalProduct_1_9(int num)
// This function iterates over a loop till Sqrt(n) and searches for factors of given input.
// for each factor, this loop calls for Is_Pandigital_product function
{
   for (int Iterator = 1; Iterator * Iterator <= num; Iterator++)
      if (num % Iterator == 0 && Is_Pandigital_product(to_string(num) + to_string(Iterator) + to_string(num / Iterator)))
   return true; //Returns true if found pandigital number
   return false;
}
int main() {
   int num = 1234;
   if (PandigitalProduct_1_9(num) == true)
      cout << "yes the number " << num << " is a pandigital product";
   else
      cout << "no the number " << num <<" is not a pandigital product";
    return 0;
}

输出

yes the number 1234 is a pandigital product

时间复杂度 - 由于我们使用了从 1 到 sqrt(n) 迭代的单循环,因此此解决方案的时间复杂度为 O(N^1/2)

空间复杂度 - 由于代码不需要任何额外内存,因此空间复杂度是线性的,即 O(1)。

在本文中,我们学习了什么是全数字,以及一个有效的方法来判断给定数字及其因数(成对)是否在相乘后组合成一个字符串,得到一个 9 位全数字。

更新于:2023年4月11日

191 次查看

开启您的职业生涯

完成课程获得认证

开始
广告