9-27蚂蚁笔试

第二题:给定一个数x,有两种操作1: 减一和2: 除以一个素数。1操作只能在2操作前面。
十亿以内最大的素数间隔不超过300,知道这个的话这题应该不难
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
const int maxn = 1e9 + 5;
// 素数筛法
vector<int> calprime(int n) {
	bool flag[n+1];
	memset(flag,0,sizeof(flag));
	vector<int> prime;
	int cnt = 0;//素数个数
	for(int i=2;i<n;i++) {
		if(!flag[i]) {
			prime.push_back(i);//将i加入素数表
			cnt++; 
		}
		for(int j=0;j<cnt;j++) {
			if(i * prime[j] > n) break;
			flag[i * prime[j]] = 1;
			if(i % prime[j]==0) break;
		}
	}
	return prime;
}
int cal(vector<int>& ve, int x) {
    int len = ve.size();
    int ans = 0;
    for (int i = 0; i < len && x >= ve[i]; ++i) {
        while (x % ve[i] == 0) {
            x /= ve[i];
            ans += 1;
        }
    }
    if (x > 1) ans += 1;
    return ans;
}
int main() {
    vector<int> ve = calprime(int(sqrt(maxn)));
    int T; cin >> T;
    // 十亿以内素数最大间隔为282
    int delta = 1000;
    while (T--) {
        int ans = maxn;
        int n; cin >> n;
        for (int i = 0; i < delta && n - i >= 0; ++i) {
            ans = min(ans, i + cal(ve, n - i));
        }
        cout << ans << '\n';
    }
}


#蚂蚁笔试#
全部评论
两个知识点:欧拉筛法和素因子表达式唯一 不过为什么只选择计算sqrt(10**9)内的素因子?
点赞 回复 分享
发布于 2022-09-28 11:53 安徽

相关推荐

10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
评论
1
8
分享
牛客网
牛客企业服务