来喽来喽,久违的更新
题目
大鱼定义 f(x) 为正整数 x 除它本身之外的最大约数和次大约数之和,例如 f(12)=6+4=10。特殊的,若正整数 x 只存在一个除它本身之外的约数,则 f(x) 为这个约数的值,例如 f(5)=1;若正整数 x 不存在除它本身之外的约数,则 f(x) 为 0。
现在大鱼给出 n 次询问,每次询问一个正整数 xi,请你帮他求出 f(xi)。
输入
第一行输入一个正整数 n (1≤n≤100)。
之后 n 行每行一个正整数 xi (1≤xi≤10^5)。
输出
输出共 n 行,每行一个整数表示 f(xi)。
样例组
输入 1
6
1
2
3
4
5
6
输出1
0
1
1
3
1
5
耗子的思路
非常非常多组数据
这个题目的考点是质数判断和循环取约数
对于每次询问的数,直接从大到小找两个非本身的约数出来即可✌🏻
还有一种特殊的情况
没戳,若正整数 x 只存在一个除它本身之外的约数,则 f(x) 为这个约数的值
还有还有,如果正整数 x 不存在除它本身之外的约数,则 f(x) 为 0💔
素数只有1个除它本身的约数1,而1没有除它本身的约数
开始写代码了
这个是素数判断的代码
可以使用暴力来做素数判断
通常情况下判断素数都叫isPrime吧
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;
}
在主函数里只需要调用isPrime(n)就可以了
素数判断搞定
其他没什么了,正常按照题意输出就好了
主要就是考判断素数
#include <bits/stdc++.h>
using namespace std;
//点赞点赞点赞
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
if(x==1)
cout<<0<<endl;
else{
int a=0,b=0;
for(int i=x-1;i>=1;i--){
if(x%i==0){
//找最大约数a
if(a==0)
a=i;
//找次大约数b
else if(b==0)
b=i;
//两个都找到就可以结束了
if(a!=0&&b!=0)
break;
}
}
//输出
cout<<a+b<<endl;
}
}
return 0;
}
完结撒花,坐等更新。。