P-光滑数或P-易碎数


如果一个数的所有质因数都小于或等于p,则该数为p-光滑数或p-易碎数。

例如,1620 是一个 5-光滑数。因为 1620 的质因数是:2、3 和 5。可以看出,1620 也是一个 7-光滑数和 11-光滑数。

问题陈述

给定两个数 N 和 P,我们必须检查 N 是否为 P-易碎数。

示例

Input −  N = 50, P = 7
Output −  Yes, 50 is a 7-friable number.

解释

50 可以质因数分解为:5*5*5*5。

因此,50 的质因数只有 5。

由于 5 小于 7,因此 50 是一个 7-易碎数或 7-光滑数。

Input −  N = 1620, P = 3
Output −  No, 1620 is not a 3-friable number.

解释

1620 可以质因数分解为:2*2*3*3*3*3*5。

因此,1620 的质因数是 2、3 和 5。

由于 5 大于 3,因此 1620 不是一个 3-易碎数或 3-光滑数。

Input: N = 30, P = 7
Output: Yes, 30 is a 7-friable number.

解释

30 可以质因数分解为:2*3*5。

因此,质因数是 2、3 和 5。

由于所有数字都小于 7,因此 30 是一个 7-易碎数或 7-光滑数。

方法

我们必须对数字 N 进行质因数分解,然后找到 N 的最大质因数。

要对数字进行质因数分解,我们遵循以下方法

  • 如果数字可以被 2 整除,则将 2 存储为最大质因数,并将 N 除以 2。

  • 继续将 N 除以 2,直到它变成奇数。

  • 现在,从 3 开始循环到 N 的平方根。当 i 可以整除 N 时,继续将 N 除以 i。

  • 在循环结束时,如果 N 大于 2,则它是一个质数。将其存储为最大质因数。

  • 比较最大质因数和输入 P。

  • 如果 P 大于或等于最大质因数,则打印 Yes。

伪代码

main() −

  • 初始化 N 和 P。

  • 函数调用 is_Pfriable(N,P)。

  • 打印结果。

is_Pfriable(int n, int p) −

  • largest__prime_factor -> -1

  • 当 n 可以被 2 整除时 −

    • 将 n 除以 2。

    • largest_prime_factor -> maximum(largest_prime_factor, 2)

  • 对于 i->3 到 i->square_root(n)

    • 当 n 可以被 i 整除时

      • largest_prime_factor -> maximum(largest_prime_factor, i)

      • 将 n 除以 i

  • 如果 n > 2

    • largest_prime_factor -> maximum(largest_prime_factor, i)

  • 如果 p >= largest_prime_factor

    • 返回 True

  • 否则

    • 返回 False

示例

下面是一个 C++ 程序,用于检查一个数是否为 P-光滑数或 P-易碎数。

#include <bits/stdc++.h>
using namespace std;
// Function to check if the number n is a P-smooth or P-friable number or not.
bool is_Pfriable(int n, int p){
   //Variable to store the value of the largest prime factor.
	int largest_prime_factor = -1;
	//While loop to divide N till is becomes indivisible by 2.
	//It will also factorize N by all the multiples of 2.
	while ((n % 2)==0){
	   //Store the maximum value.
		largest_prime_factor = max(largest_prime_factor, 2);
		//Keep dividing by 2.
		n = n/2;
	}
   //For loop till the square root of n, since factors exist in pairs.
   //Checking for all the possible factor of n.
	for (int i = 3; i <= sqrt(n); i += 2){
      //Eliminate all the multiples of i which could be the factors of n. That is, prime factorize n by i.
		while (n % i == 0){
			largest_prime_factor = max(largest_prime_factor,i);
			//Keep dividing by i.
			n = n / i;
		}
	}
   //If n>2, then it is a prime factor, and thus, the largest prime factor of itself.
	if (n > 2){
	   largest_prime_factor = max(largest_prime_factor, n);
	}
	//If p is greater than or equal to the largest prime factor of n, then n is p-friable. Hence, return true.
	if(p>=largest_prime_factor){
	    return true;
	}
	//Return false because n is not p-friable.
	return false;
}
int main(){
   //Initialize input
	int n = 56, p = 5;
	//Function call
	//If the function return true, then n is p-friable.
	if (is_Pfriable(n, p)){
	   cout<<"Yes, "<<n<<" is a "<<p<<" friable number"<<endl;
	}
	else{
	   cout<<"No, "<<n<<" is not a "<<p<<" friable number"<<endl;
	}
	return 0;
}

输出

No, 56 is not a 5 friable number

分析

时间复杂度 − O(sqrt ( N ) * log N),

复杂度是这样的,因为 for 循环。

外部 for 循环的复杂度为 sqrt(N)。内部循环的复杂度为对数。因此,最终结果是它们的乘积。

空间复杂度 − O(1) [常数]

空间复杂度是常数,因为我们没有使用任何额外的空间。

结论

在本文中,我们讨论了 P-光滑数或 P-易碎数的概念。我们解决了给定数字是否为 P-易碎数的问题。我们通过一些示例了解了问题陈述,然后查看了方法、伪代码和 C++ 程序。

更新于: 2023年8月16日

120 次浏览

开启你的 职业生涯

完成课程获得认证

开始学习
广告