每日一小题——试除法

#第k个除数
给定两个整数 n 和 k,请你找到并输出能够整除 n 的第 k 小的正整数。

输入格式
一行,两个整数 n 和 k。

输出格式
输出能够整除 n 的第 k 小的整数。

如果不存在,则输出 −1。

数据范围
1≤n≤1015
1≤k≤109
##代码模板

vector<int> get_divisors(int x)
{
    vector<int> res;
    for (int i = 1; i <= x / i; i ++ )
        if (x % i == 0)
        {
            res.push_back(i);
            if (i != x / i) res.push_back(x / i);
        }
    sort(res.begin(), res.end());
    return res;
}

题解(数论)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
vector<ll> a;
int main()
{
    cin >> n >> k;
    for(ll i = 1; i * i <= n; i++)//试除法
    {
        if(n%i == 0)
        {
            a.push_back(i);//把能够整除n的数字放进a中
            if(i != n / i)
            a.push_back(n / i);//能够被i整除,那么n/i也能被整除
        }
        
    }
    sort(a.begin(),a.end());
    if(k > a.size()) cout << -1 << endl;
    else cout << a[k - 1] << endl;
    return 0;
}

###debug心得
在这里插入图片描述

因为数据很大,所以一定要开long long !
i要从1开始,否则n/i时会报错!
if语句的括号要考虑清楚才舍掉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值