[PAT乙级]自测2
自测题3 1014.因子个数
题目描述
一个正整数可以分解成一个或多个数组的积。例如36=2*2*3*3,即包含2和3两个因子。NowCoder最近在研究因子个数的分布规律,现在给出一系列正整数,他希望你开发一个程序输出每个正整数的因子个数。
输入描述:
输入包括多组数据。
每组数据仅有一个整数n (2≤n≤100000)。
输出描述:
对应每个整数,输出其因子个数,每个结果占一行。
输入例子:
30
26
20
输出例子:
3
2
2
思路:
- 这道题我用的递归,可能受前两道题影响,用了备忘录方法,结果超时,可能是因为列出素数数组的时候用时间太长了
- 后来在讨论区看了两个觉得比较好的代码,一个是递归,另一个是循环嵌套
代码1: 递归 73ms
链接:https://www.nowcoder.com/questionTerminal/e8fb8f89f5d147ec92fd8ecfefe89b0d
来源:牛客网
#include <iostream>
#include <stdio.h>
using namespace std;
int cnt;
bool isPrime(int n)
{
if(n<2) return false;
if(n == 2) return true;
if(n%2 == 0) return false;
for(int i=3; i*i <= n; i+=2) {
if(n%i == 0) return false;
}
return true;
}
void countFactors(int n, int start)
{
if(isPrime(n)) {
cnt++; return;
} else {
for(int i=start; i<n; i++) {
if(0 == n%i) {
cnt++;
while(0 == n%i) {
n /= i;
}
countFactors(n, i+1);
return;
}
}
}
}
int main()
{
int n;
while(~scanf("%d", &n)) {
cnt = 0;
countFactors(n, 2);
printf("%d\n", cnt);
}
return 0;
}
代码2: 循环嵌套 112ms
链接:https://www.nowcoder.com/questionTerminal/e8fb8f89f5d147ec92fd8ecfefe89b0d
来源:牛客网
#include<stdio.h>
#include<math.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,sum=0;
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
sum++;
n /= i;
}
while(n%i==0)
{
n/=i;
}
}
if(n != 1 ) //n为质数的情况
sum++;
printf("%d\n",sum);
}
return 0;
}
代码3: 递归 超时超时超时!!!!!!!!
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
vector<int> arr;//100000以内素数数组
bool isSushu(int n){
for(int i=2; i*i<=n; i++){
if(n%i == 0){
return false;
}
}
return true;
}
int help(vector<int> &Yinzi, vector<int> res, int n){
if(Yinzi[n] != 0)
return Yinzi[n];
int temp = n;
bool flag = true;
while(temp != 1){
for(int i=0; i<arr.size(); i++){
if(temp%arr[i] == 0){
temp /= arr[i];
if(Yinzi[temp] != 0){
if(res[arr[i]] != 0){
Yinzi[n] = Yinzi[temp];
}else{
Yinzi[n] = Yinzi[temp] + 1;
}
flag = false;
break;
}
res[arr[i]]++;
break;
}
}
if(!flag)
break;
}
int countt = 0;
for(int i=0; i<=n; i++){
if(res[i] != 0)
countt++;
}
return Yinzi[n] = countt;
}
int main()
{
vector<int> Yinzi(100001);//备忘录 存储各个整数的因子个数
vector<int> res(100001);//存储因子个数
int n;
while(~scanf("%d", &n)){
for(int i=2; i<=n; i++){
if(isSushu(i))
arr.push_back(i);
}
printf("%d\n", help(Yinzi, res, n));
}
return 0;
}