C++ P – 给定范围内的光滑数

C++ P – 给定范围内的光滑数

P光滑数是其最大质因数小于或等于给定数字P的数。质数是只能被1和本身整除的数。默认情况下,对于任何给定的P值,1都被认为是P-光滑数。在这个问题中,我们将给出一个值P和一个范围,我们需要返回该范围内存在的且是P光滑数的元素数量。

输入

Given the value of P is 7 and the range is 10 to 20 (where 10 and 20 are inclusive) and 1 to 10;

输出

10, 12, 14, 15, 16, 18, 20.
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

解释

在给定的范围内,数字11、13、17和19都是质数,并且最大质因数等于它们自身,且比给定的P值更大。

对于剩下的元素,较大的除数小于或等于7。

对于第二个范围,我们有所有的元素,其最大质因数小于或等于p或7。

方法1

在这个方法中,我们将遍历给定范围,并对于每个元素,我们将找到每个数字最大的质数因子,如果该值小于或等于给定的数字,则将返回它们。

例子

#include <bits/stdc++.h>
using namespace std;
// function to find the max prime integer 
int maxPrimeDivisor(int cur){
    int res = 1;
   // base condition 
    if (cur == 1) {
        return res;
    }
    while (cur % 2 == 0) {
        res = 2;
        cur = cur / 2;
    }
    // getting the sqrt root 
    int squareRoot = sqrt(cur) + 1;
    for (int i = 3; i < squareRoot; i += 2) {
        while (cur % i == 0) {
            res = i;
            cur /= i;
        }
    }
    // When cur is prime itself
    res = max(res, cur);
    return res;
}
// function to find the P smooth in the given range 
void findPSmooth(int l, int r, int p){
   // traversing over the given range of elements 
   for(int i =l ; i<= r; i++){
      int cur = maxPrimeDivisor(i);
      if(cur > p){
         continue;
      }
      else{
         cout<<i <<" ";
      }
   }
   cout<<endl;
}
int main(){
    int p = 7; // defining the variables 
    int n = 2; // total number of ranges 
    // array to define the ranges 
    int arr[][2] = {{10, 20}, {1, 10}};
    // calling the function to find the result 
    for(int i=0; i<n;i++){
       cout<<"The elements which are P-Smooth in the range of  "<<arr[i][0]<<" and  "<<arr[i][1]<<" are: "<<endl;
       findPSmooth(arr[i][0], arr[i][1], p);
    }
    return 0;
}

输出

The elements which are P-Smooth in the range of  10 and  20 are: 
10 12 14 15 16 18 20 
The elements which are P-Smooth in the range of  1 and  10 are: 
1 2 3 4 5 6 7 8 9 10

时间与空间复杂度

上述代码的时间复杂度为(Nsqrt(N)log(N)*M),其中N是范围中的最大元素,M是提供的范围总数。

上述代码的空间复杂度为O(1),因为我们在这里没有使用任何额外的空间。<

方法2

在前面的方法中,我们找到了每个范围的p-smooth元素。在这种方法中,我们将获得范围最大值中的所有元素,然后返回它们。<

示例

#include <bits/stdc++.h>
using namespace std;
vector<int> p_smooth;
// function to find the max prime integer 
int maxPrimeDivisor(int cur){
    int res = 1;    
   // base condition 
    if (cur == 1) {
        return res;
    }
    while (cur % 2 == 0) {
        res = 2;
        cur = cur / 2;
    }
    // getting the sqrt root 
    int squareRoot = sqrt(cur) + 1;
    for (int i = 3; i < squareRoot; i += 2) {
        while (cur % i == 0) {
            res = i;
            cur /= i;
        }
    }
    // When cur is prime itself
   res = max(res, cur);
    return res;
}
// function to get the p_smooth elements
void calPSmooth(int mx, int p){
   for(int i=1; i<=mx; i++){
      if(maxPrimeDivisor(i) <= p){
         p_smooth.push_back(i);
      }
   }
}
// function to find the P smooth in the given range 
void findPSmooth(int l, int r){
   // traversing over the given range elements 
   for(int i = 0 ; i< p_smooth.size(); i++){
      if(p_smooth[i] > r){
         break;
      }
      if(p_smooth[i] >= l){
         cout<<p_smooth[i]<<" ";
      }
   }
   cout<<endl;
}
int main(){
    int p = 7; // defining the variables 
    int n = 2; // total number of ranges 
    int mx = 100; // maximum range 
    // array to define the ranges 
    int arr[][2] = {{10, 20}, {1, 10}};
    // calling the function to get all the pSmooth elements 
    calPSmooth(mx,p);
    // calling the function to find the result 
    for(int i=0; i<n;i++){
       cout<<"Element which are P-Smooth in the range "<<arr[i][0]<<" "<<arr[i][1]<<" are: "<<endl;
       findPSmooth(arr[i][0], arr[i][1]);
    }
    return 0;
}

输出

The elements which are P-Smooth in the range of 10 and 20 are: 
10 12 14 15 16 18 20 
The elements which are P-Smooth in the range of 1 and 10 are: 
1 2 3 4 5 6 7 8 9 10

时间和空间复杂度

以上代码的时间复杂度为(Msqrt(M)log(M) + N),其中N是范围内最大的元素,M是提供的范围总数。

以上代码的空间复杂度为O(M),因为我们存储了p个平滑元素。

结论

在本教程中,我们实现了一个在给定范围内查找P-平滑数的代码。P平滑数是指最大质数因子小于或等于给定数P的数。我们实现了时间复杂度为(Msqrt(M)log(M) + N)和(Nsqrt(N)log(N)*M)的代码。此外,空间复杂度为O(1)和O(M)。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程