题目
分析(从质数的判断角度出发)(递归)
- 判断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);elseprintf("%d\n",count);}return 0;
}