请用C++讲解一下这道题谢谢!题目背景zyh 一到机房所有做题的人便都看着他笑有的叫道zyh你又来出数学题了! 他不回答对众人说我又看到两道数学题都来做做。 便排出一排数学题。大家又故意的高声嚷道你又暴露 Moer 本性拿数学题恶心众人了! zyh 睁大眼睛说你怎么这样凭空污人清白…… 什么清白?我前天亲眼见你出了道垃圾数学题勾股计数被分块打表吊打 std 。 zyh 便涨红了脸额上的青筋条条绽出
题目要求判断对于给定的正整数d,是否存在一个正整数n,满足d是(n!+1)的次小约数,如果存在则输出任意一个合法的n,否则输出0。
首先,我们可以先计算出n!+1的所有约数。然后从1开始遍历这些约数,找到第一个大于d的约数,即为次小约数。如果找不到则输出0。
具体实现如下:
#include <iostream>
#include <vector>
using namespace std;
vector<int> getDivisors(int n) {
vector<int> divisors;
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
divisors.push_back(i);
if (i != n / i) {
divisors.push_back(n / i);
}
}
}
return divisors;
}
int main() {
int T;
cin >> T;
while (T--) {
int d;
cin >> d;
vector<int> divisors = getDivisors(d - 1);
int n = 0;
for (int i = 0; i < divisors.size(); i++) {
if (divisors[i] > d) {
n = divisors[i] - 1;
break;
}
}
cout << n << endl;
}
return 0;
}
首先定义了一个getDivisors函数,用于计算一个数的所有约数。通过遍历1到sqrt(n)的数,找到能整除n的数,并将其和n除以这个数的结果都加入到约数列表中。
在主函数中,先读入数据组数T。然后对于每组数据,读入一个数d,并调用getDivisors函数得到d-1的所有约数。接下来遍历这些约数,找到第一个大于d的约数,将其减1赋值给n。最后输出n。
这样就完成了题目的要求
原文地址: http://www.cveoy.top/t/topic/h0qc 著作权归作者所有。请勿转载和采集!