得物笔试 得物笔试题 0906
笔试时间:2025年9月6日
往年笔试合集:
第一题
小明最近刚刚学习完素数的概念,老师出了一个课后练习。问题是:如果将一个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等多种语言做法集合指南
美的集团公司福利 798人发布
