第k的最小素数

今天不上班,我去老家一趟把博客更下

给你一个按递增顺序排序的数组 arr 和一个整数 k 。数组 arr 由 1 和若干 素数 组成,且其中所有整数互不相同。

对于每对满足 0 <= i < j < arr.length 的 i 和 j ,可以得到分数 arr[i] / arr[j] 。

那么第 k 个最小的分数是多少呢? 以长度为 2 的整数数组返回你的答案, 这里 ans。
这个解题思路很惭愧不是我的,我去看了别人思路的才写出来了,很惭愧

class Solution {
public int[] kthSmallestPrimeFraction(int[] arr, int k) {
PriorityQueue<int[]> pq = new PriorityQueue<int[]>((a,b)->arr[a[0]]*arr[b[1]] - arr[a[1]]*arr[b[0]]);
for(int i = 1; i < arr.length; i++){
pq.add(new int[]{0, i});
}
while(k > 1){
int[] frac = pq.poll();
if(frac[0]++ < frac[1]){
pq.add(frac);
}
k–;
}
int[] ans = pq.poll();
return new int[]{arr[ans[0]], arr[ans[1]]};
}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先需要判断一个数是否为素数,可以使用试除法,即从2到这个数的平方根依次判断是否能整除,如果都不能整除,则这个数为素数。 接着,可以使用一个循环,从x开始依次判断每个数是否为素数,如果是素数,则计数器加1,直到计数器等于k为止。同时,需要注意判断素数的时候,如果一个数不是素数,则可以直接跳过它的倍数,因为它的倍数一定不是素数。 最后,输出k个素数即可。 ### 回答2: 首先我们需要了解什么是素数素数是只能被1和它本身整除的自然数,并且大于1。例如2、3、5、7、11等都是素数,而4、6、8、9等则不是。使用朴素的方法判断一个数是否为素数,需要从2开始一直到这个数的平方根,逐一判断是否能被整除。如果都不能被整除,则这个数是素数。 接下来我们需要思考如何找大于等于x的k个最小素数。我们可以从x开始,依次判断每个数是否为素数,如果是素数,则将其加入一个列表中,直到列表中素数的数量达到k个为止。判断一个数是否为素数时,可以使用上面提到的朴素的方法。需要注意的是,我们需要判断是否大于等于x,因此在判断某个数是否为素数时,如果这个数小于x,则需要继续判断下一个数。 另外,为了加速判断素数的过程,我们可以使用一些优化算法,例如质数筛法。这种算法是用来筛选素数的,可以先将2的倍数标记为合数,再将3的倍数标记为合数,以此类推,直到所有的合数都被标记为止。最终没有被标记的数就是素数。 综上所述,我们可以使用以下步骤来找到大于等于x的k个最小素数: 1. 定义一个空的列表。 2. 从x开始,逐个判断每个数是否为素数,并将素数加入列表中,直到列表中素数的数量达到k个为止。 3. 在判断某个数是否为素数时,可以使用朴素的方法或者其他优化算法,例如质数筛法。 4. 如果某个数小于x,则需要继续判断下一个数。 5. 返回素数列表。 ### 回答3: 题目要求输出大于等于x的k个最小素数,那么我们需要首先了解什么是素数素数是只能被1和本身整除的数,比如2、3、5、7、11、13等。而非素数则是除了1和本身还可以被其他数整除的数,比如4、6、8、9等。 因此,我们需要编写一个判断素数的函数,然后在主程序中根据题目要求依次输出大于等于x的k个最小素数。 判断素数的函数可以采用试除法,即从2开始到该数的平方根进行整除,如果能整除则不是素数,反之则是素数。具体代码实现如下: bool IsPrime(int n) { for(int i=2;i<=sqrt(n);i++) { if(n%i==0) return false; } return true; } 在主程序中,首先读入x和k两个正整数,然后依次判断从x开始的所有数是否是素数,符合条件就输出并计数,直到输出了k个素数为止。具体代码实现如下: int main() { int x,k,count=0,num=x; cin>>x>>k; while(count<k) { if(IsPrime(num)) { if(num>=x) { cout<<num<<" "; count++; } } num++; } return 0; } 这样,我们就可以通过编写函数和主程序来实现输出大于等于x的k个最小素数的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值