题目
分析(从质数的判断角度出发)(递归)
- 判断n是否是质数需要:
- 遍历,i从2开始到sqrt(n),每次判断n是否能整除i,若能则不是质数,若不能则是
思路:
- 先判断n是否为质数,是就直接返回1
- 不是质数,返回最小整除的i,然后计算n/i的质因数个数
递归流程:
- 大事化小:n的质因数个数=(n/i)的质因数个数+1,其中i是最小整除的质数因子
- 小事化了:最后分解成为一个质数,直接返回1
从质数的判断角度出发递归代码
#include <cstdio>
#include <cmath>
using namespace std;
int in_num(int n){
for(int i=2;i<=sqrt(n);i++){
if (n%i==0) {
return i;
}
}
return -1;
}
int counts(long long n){
int i = in_num(n);
if(i==-1){
return 1;
}
for (; (i<=n/2); ++i) {
if (n%i==0&&in_num(i)==-1){
break;
}
}
return 1+counts(n/i);
}
int main() {
long long n;
while (scanf("%lld",&n)!=EOF) {
printf("%d\n",counts(n));
}
}
// 64 位输出请用 printf("%lld")
从质数性质出发(大大简化)
质数本身具有的性质:只能被1和自身整除
那么在计算质因子时候,其实不用考虑除数是不是质因子,因为:
- 如果最小因子是质数,肯定要遍历到这个数才能除得尽
- 如果最小因子不是质数,当然这种情况不存在,因为不是质数说明该因子也有自己的因子,那他就不是最小因子,因此遍历不到这个数就已经除得尽了
从质数性质出发代码
#include <stdio.h>
int main()
{
int s,i,count;
while(scanf("%d",&s)!=EOF)
{
count=0;
for(i=2;i*i<=s;i++)
{
while(s%i==0)
{
count++;
s=s/i;
}
}
if(s>1)
printf("%d\n",count+1);
else
printf("%d\n",count);
}
return 0;
}