JavaScript程序:检查数组元素能否通过旋转数字转换为普洛尼克数


普洛尼克数也称为矩形数,它是两个连续整数乘积的数。我们将得到一个整数数组,我们可以旋转数字任意次数以获得所有组合。如果通过旋转数字产生的任何组合都能将每个数组元素转换为普洛尼克数,则输出true,否则输出false。

普洛尼克数

首先,让我们讨论普洛尼克数:普洛尼克数是两个连续整数的乘积。

数学上来说,如果我们有整数x,其下一个连续整数为x+1,并且数k是它们的乘积,这意味着:k = (x)*(x+1)。一些普洛尼克数的例子是

  • 0是0和1的乘积。

  • 2是1和2的乘积。(原文有误,应为2)

  • 6是2和3的乘积。

-> 12, 20, 30, 42, 56, 72, 90, 110, 132, 156, 182, 210, 240, 272,等等。

示例

假设我们得到一个数组:

{ 21, 65, 227, 204, 2}

输出:Yes

解释

对于第零个索引:21,旋转一次后可以转换为12,它是3和4的乘积,因此是普洛尼克数。

对于第一个索引:65,旋转一次后可以转换为56,它是7和8的乘积,因此是普洛尼克数。

对于第二个索引:227,旋转一次后可以转换为272,这是一个普洛尼克数。

类似地,204可以转换为420,而2本身就是一个普洛尼克数。

方法

我们已经看到了代码示例,现在让我们来看步骤:

  • 首先,我们将定义一个函数来旋转给定的数字。整数将作为参数传递,并将转换为字符串。

  • 使用substring方法,我们将字符串向右旋转,然后将其转换回数字并返回。

  • 我们将定义一个pronic函数来检查当前数字是否是普洛尼克数。

  • 我们将找到当前数字平方根的floor值,并将其与连续数字相乘,以确定当前数字是否是普洛尼克数。

  • 我们将定义一个函数,通过将数字转换为字符串来查找当前数字的位数。

  • 在主函数中,我们将遍历数组,对于每个元素,我们将旋转其长度的次数,或者直到找到普洛尼克数。

  • 如果在所有迭代后我们找到任何不是普洛尼克数并且无法将其转换为普洛尼克数的数字,我们将输出no,否则输出yes。

示例

在下面的示例中,我们检查是否可以通过旋转数字将数组的所有元素转换为普洛尼克数。输入和预期输出如下所示。

输入:Array = [21, 65, 227, 204, 2]

预期输出:Yes

// function to rotate the digits
function rotate(num){

   // converting integer to string
   var str = num.toString();
   
   // putting first index value to last
   str = str.substring(1) + str.substring(0,1);
   
   // converting back string to integer
   num = parseInt(str);
   return num;
}

// function to check whether current number if pronic number or not
function isPronic(num){

   // getting square root of the current number
   var cur = Math.sqrt(num);
   
   // taking floor of cur
   cur = Math.floor(cur);
   if(cur*(cur+1) == num) {
      return true;
   }
   else {
      return false;
   }
}

// function to find the length of the current integer
function number_length(num){
   var str = num.toString()
   var len = str.length;
   return len;
}

// function to check whether array is pronic or not
function check(arr){
   var len = arr.length;
   for(var i =0; i<len; i++){
      // getting length of the current number
      var cur = number_length(arr[i]);
      while(cur--){
         if(isPronic(arr[i])){
            break;
         }
         arr[i] = rotate(arr[i]);
      }
      if(isPronic(arr[i]) == false){
         return false;
      }
   }
   return true;
}
var arr = [21, 65, 227, 204, 2]
console.log("Array:", JSON.stringify(arr))
if(check(arr)){
   console.log("The elements of array can be converted to pronic numbers.");
}
else{
   console.log("The elements of array can't be converted to pronic numbers.");
}

输出

Array: [21,65,227,204,2]
The elements of array can be converted to pronic numbers.

时间和空间复杂度

上述代码的时间复杂度为O(N),其中N是数组的大小。在这里,我们为遍历数组和获取其平方根都获得了额外的对数因子(数字大小的对数),但是由于给定整数的最大长度非常小,因此对线性时间复杂度没有影响。

上述代码的空间复杂度是常数或O(1),因为我们没有使用任何额外的空间。

结论

在本教程中,我们实现了一个JavaScript程序,用于查找是否可以通过向左或向右旋转数字来将数组的每个元素转换为普洛尼克数。我们定义了某些函数来旋转数字、检查它们是否是普洛尼克数以及获取数字的位数。上述代码的时间复杂度为O(N),空间复杂度为O(1)。

更新于:2023年4月13日

63 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告