题目:来源于洛谷
分析:
首先1是质数吗?1不是质数,好的,那么找到的两个质数,最大的也不可能是输入的n
我想的是打表,然后利用双指针,一头一尾的找
来吧,看看能不能AC?
在写代码的过程,我发现 i 从0开始找, j 找 n/3 的位置从后往前找,可以节省点时间
算了,不打表了。
第一次提交代码:
#include <iostream>
#include <cstdio>
using namespace std;
bool isPrime(int n) {
if (n < 1) {
return false;
}
for (int i = 2; i*i <= n; ++i) {
if (n%i == 0) {
return false;
}
}
return true;
}
int main()
{
int n;
cin >> n;
int i = 2, j = n / 2;
while (i < j) {
//直到i找到质数,跳出
while (i < j && !isPrime(i)) {
i++;
}
//直到找到质数,跳出
while (i < j && !isPrime(j)) {
j--;
}
//如果开始 i 和 j都是质数,且i*j!=n, 由于我们要找的是最大的质因数,所以i++即可
if (n == i * j) {
cout << j;
break;
}
else {
i++;
}
}
return 0;
}
好吧,我第一次提交只得了30分
百思不得其解之后,我决定看看题解,好家伙,这题考数学
请原谅我这个数学不及格的小彩笔(+_+)?
根据题解我写一下自己的理解:首先需要知道,除平方数以外的数,这些数的约数都是成对出现的。
例如:
26=213, 126(两对约数)
16是平方数,16=116, 28,4*4(3对,不是成对出现的)
因此,我们只需找n的最小约数(1除外),然后n / i 就得到结果了
话不多说,上代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
//什么,考数学
int n, i;
cin >> n;
for (i = 2; i*i <= n; ++i) {
if (n%i == 0) {
break;
}
}
cout << n / i;
return 0;
}
溜了溜了(。・∀・)ノ