题目
西电-ProblemC
题目描述
对于给定的字符序列,从左至右将所有的数字字符取出拼接成一个无符号整数(字符序列长度小于100,拼接出的整数小于2^31,),计算并输出该整数的最大素因子(如果是素数,则其最大因子为自身)
题目链接
https://www.nowcoder.com/practice/2a05dcaa4cde4db989443f206ee3e5c5?tpId=40&tqId=31031&tPage=14&rp=14&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking
代码
#include <bits/stdc++.h>
using namespace std;
//每一个合数可以写成几个素数的乘积,判断一个数是否为素数,只需要判断不大于sqrt(n)中的数是否存在n的因子
//也就是合数一定存在不大于sqrt(n)的因子, 从因子2开始,从sqrt(n)的数中,从小到大不断抽取n的素因子(合数因子由素数因子构成,所以记录不到),
int MaxPrime(int n)
{ int max;
for(int i=2;i*i<=n;i++)
{
while(n%i==0)
{
max = i;
n = n/i;
}
}
if(n!=1)
max = n;
return max;
}
int main()
{
int n;
cin>>n;
char str[105];
int num;
while(n--)
{ num = 0;
int ans=0;
memset(str,0,100);
cin>>str;
//cout<<str<<endl;
for(int i=0;i<100;i++)
{
if(str[i]>='0'&&str[i]<='9')
{
num = num*10+(str[i]-'0');
//cout<<num<<endl;
}
}
cout<<MaxPrime(num)<<endl;
}
return 0;
}
思考
一个合数可以由若干素数的乘积组成,若最大素因子大于sqrt(n),那么一定有素因子小于sqrt(n),遍历不大于sqrt(n)的所有素因子,用max记录当前因子(合数因子n先除尽素数因子,所以max总是记录素数因子),若最后n==1,说明,所有素因子都小于sqrt(n),此时max记录为答案;若n!=1,说明,存在大于sqrt(n)的素因子,且为n。