孙悟空的金箍棒
描述
顽皮的悟空又在大闹天宫了,太上老君觉得悟空太闹腾了,于是让你去收掉悟空的作案工具金箍棒,太上老君给了你一个法宝,可以收掉悟空的金箍棒,但是有个限制,只能放下长度为质数时的金箍棒,例如长度时8,就放不下,但是将他缩短为2就可以放下,但是金箍棒不是你的法宝,你不能随意的变化,需要符合规则(即长度为l,x为l的因子,那么你可以变为l/x的长度,你可以做出任意次这样的操作,知道l为质数)。
例如:l=12,选择12的因子2,此时l=6,再选择6的因子2,此时结果为3,为质数。但是很明显,这个方案不一定是最优的。
day08-02.zip
输入
第一个一个整数T(0<T<1e5),表示数据组数
其后T行,每行一个整数l,表示金箍棒的长度(l<=1e6)
输出
T行,每行一个整数,表示最少的操作次数
输入样例 1
2
4
3
输出样例 1
1
0
#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int minCalc(int l) {
if (isPrime(l)) {
return 0;
}
for (int i = 2; i <= sqrt(l); i++) {
if (l % i == 0) {
return 1 + minCalc(l / i);
}
}
return -1;
}
int main() {
int T;
cin >> T;
for (int t = 0; t < T; t++) {
int l;
cin >> l;
int min = minCalc(l);
cout << min << endl;
}
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!【以下回答由 GPT 生成】
解题思路:将金箍棒的长度l不断缩短为l/x,直到l为质数为止。由于题目中l的范围为1e6,所以可以使用筛选法来找到所有的质数,然后从l的约数中找到最小的质数。
具体步骤如下:
Python代码如下:
# 筛选法找到1e6以内的所有质数
def sieve_of_eratosthenes(n):
isPrime = [True] * (n + 1)
isPrime[0] = isPrime[1] = False
p = 2
while p * p <= n:
if isPrime[p]:
for i in range(p * p, n + 1, p):
isPrime[i] = False
p += 1
return isPrime
# 计算最少操作次数
def min_operations(length):
if isPrime[length]: # 如果长度本身就是质数,则不需要操作
return 0
for i in range(2, length + 1):
if length % i == 0 and isPrime[i]: # 找到最小的质数x,将长度缩短为length/x
return 1 + min_operations(length // i)
# 主函数
if __name__ == "__main__":
T = int(input())
isPrime = sieve_of_eratosthenes(10**6)
for _ in range(T):
length = int(input())
print(min_operations(length))
复杂度分析:
筛选法的时间复杂度为O(nloglogn),计算最少操作次数的时间复杂度为O(sqrt(l)),所以总的时间复杂度为O(T * sqrt(l))。空间复杂度为O(n)。其中T为数据组数,l为金箍棒的长度。
【相关推荐】