C ++程序检查是否所有数组元素都可以通过旋转数字转换为普罗尼克数
给定一个大小为N的数组arr[] ,任务是检查是否可以通过将数组元素的数字旋转任意次数来将所有数组元素转换为普罗尼克数。
例子:
Input: {321, 402, 246, 299}
Output: True
Explanation:
arr[0] → Right rotation once modifies arr[0] to 132 (= 11 × 12).
arr[1] → Right rotation once modifies arr[0] to 240 (= 15 × 16).
arr[2] → Right rotation twice modifies arr[2] to 462 (= 21 × 22).
arr[3] → Right rotation twice modifies arr[3] to 992 (= 31 × 32).
Input: {433, 653, 402, 186}
Output: False
解决方法:按照以下步骤解决问题:
- 遍历数组并检查每个数组元素,是否可以将其转换为普罗尼克数。
- 对于每个数组元素,应用所有可能的旋转并在每次旋转后检查生成的数字是否为 pronic。
- 如果无法将任何数组元素转换为普罗尼克数,请打印“False” 。
- 否则,打印“True” 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// function to check Pronic Number
bool isPronic(int x)
{
for (int i = 0; i < (int)(sqrt(x)) + 1; i++)
{
// Checking Pronic Number
// by multiplying consecutive
// numbers
if (x == i * (i + 1))
{
return true;
}
}
return false;
}
// Function to check if any permutation
// of val is a pronic number or not
bool checkRot(int val)
{
string temp = to_string(val);
for (int i = 0; i < temp.length(); i++)
{
if (isPronic(stoi(temp)) == true)
{
return true;
}
temp = temp.substr(1, temp.size() - 1) + temp[0];
}
return false;
}
// Function to check if all array
// elements can be converted to
// a pronic number or not
bool check(int arr[], int N)
{
// Traverse the array
for (int i = 0; i < N; i++)
{
// If current element
// cannot be converted
// to a pronic number
if (checkRot(arr[i]) == false)
{
return false;
}
}
return true;
}
// Driven Program
int main()
{
// Given array
int arr[] = { 321, 402, 246, 299 };
int N = sizeof(arr) / sizeof(arr[0]);
// function call
cout << (check(arr, N) ? "True" : "False");
return 0;
}
// This code is contributed by Kingash.
输出:
True
时间复杂度: O(N 3/2 )
辅助空间: O(1)
有关详细信息,请参阅有关检查所有数组元素是否可以通过旋转数字转换为普罗尼克数的完整文章!