得物笔试 得物笔试题 0906

笔试时间:2025年9月6日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

小明最近刚刚学习完素数的概念,老师出了一个课后练习。问题是:如果将一个n (n ≥ 2)位的素数拆分成两部分,其中高m位是一个素数,低(n - m)位也是一个素数,那么这个素数称为可拆分素数。

例如:113是一个素数,它可以拆成两部分:

  • 高两位11是一个素数
  • 低一位3也是一个素数 因此113是一个可拆分素数。

现在输入两个正整数M和N (M < N),请编写一个程序计算M到N之间有多少个可拆分素数(包含M和N)。

输入描述

输入两个正整数M和N,其中10 ≤ M < N ≤ 10^6,数字间空格隔开。

输出描述

输出M和N之间可拆分素数的个数(包含M和N)。

样例输入

10 100

样例输出

4

参考题解

解题思路:

使用埃拉托斯特尼筛法预处理所有小于等于10^6的素数

对每个素数,将其转换为字符串,枚举所有可能的拆分点

判断拆分后的高位和低位是否都是素数

统计满足条件的可拆分素数个数

C++:

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
using namespace std;

const int MAX = 1000000;
bool isPrime[MAX + 1];

void sieve() {
    memset(isPrime, true, sizeof(isPrime));
    isPrime[0] = isPrime[1] = false;
    for (int i = 2; i * i <= MAX; i++) {
        if (isPrime[i]) {
            for (int j = i * i; j <= MAX; j += i) {
                isPrime[j] = false;
            }
        }
    }
}

bool isSplittablePrime(int num) {
    string str = to_string(num);
    int len = str.length();
    for (int i = 1; i < len; i++) {
        int high = stoi(str.substr(0, i));
        int low = stoi(str.substr(i));
        if (isPrime[high] && isPrime[low]) {
            return true;
        }
    }
    return false;
}

int main() {
    sieve();
    int M, N;
    cin >> M >> N;
    int count = 0;
    for (int num = M; num <= N; num++) {
        if (isPrime[num] && isSplittablePrime(num)) {
            count++;
        }
    }
    cout << count << endl;
    return 0;
}

Java:

import java.util.*;

public class Main {
    static final int MAX = 1000000;
    static boolean[] isPrime = new boolean[MAX + 1];
    
    static void sieve() {
        Arrays.fill(isPrime, true);
        isPrime[0] = isPrime[1] = false;
        for (int i = 2; i * i <= MAX; i++) {
            if (isPrime[i]) {
                for (int j = i * i; j <= MAX; j += i) {
                    isPrime[j] = false;
                }
            }
        }
    }
    
    static boolean isSplittablePrime(int num) {
        String str = Integer.toString(num);
        int len = str.length();
        for (int i = 1; i < len; i++) {
            int high = Integer.parseInt(str.substring(0, i));
            int low = Integer.parseInt(str.substring(i));
            if (isPrime[high] && isPrime[low]) {
                return true;
            }
        }
        return false;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        sieve();
        int M = sc.nextInt();
        int N = sc.nextInt();
        int count = 0;
        for (int num = M; num <= N; num++) {
            if (isPrime[num] && isSplittablePrime(num)) {
                count++;
            }
        }
        System.out.println(count);
    }
}

Python:

MAX = 1000000
isPrime = [True] * (MAX + 1)

def sieve():
    isPrime[0] = isPrime[1] = False
    i = 2
    while i * i <= MAX:
        if isPrime[i]:
            j = i * i
            while j <= MAX:
                isPrime[j] = False
                j += i
        i += 1

def is_splittable_prime(num):
    s = str(num)
    length = len(s)
    for i in range(1, length):
        high = int(s[:i])
        low = int(s[i:])
        if isPrime[high] and isPrime[low]:
            return True
    return False

sieve()
M, N = map(int, input().split())
count = 0
for num in range(M, N + 1):
    if isPrime[num] and is_splittable_prime(num):
        count += 1
print(count)

第二题

小D准备去工地打工,需要将n堆砖块(第i堆砖块共有ai块砖)从a处搬到b处。

  • 如果小D自己动手搬,则用x秒的时间可以将一块砖从a处搬到b处
  • 如果使用卡车,则用y秒的时间可以将一整堆砖块从a处搬到b处
  • 由于油耗限制,最多只能用卡车搬运K堆砖块

小D想知道,在不断搬砖的情况下

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务