全数字产品
给定两个数字,我们的任务是确定给定数字是否由另外两个数字相乘得到,并且这三个数字组合在一起构成一个 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 位全数字。