因式分解

问题 d: 【递归入门】因式分解

时间限制: 3 Sec  内存限制: 128 MB
提交: 19  解决: 5
[提交][状态][讨论版][命题人:外部导入]

题目描述

1 < n < = 2^31 
n = a1*a2*a3*a4.......*am 
比如: 
12=12 
12=6*2 
12=4*3 
12=3*4 
12=3*2*2 
12=2*6 
12=2*3*2 
12=2*2*3 

总共8种

 

输入

 一行一个整数n(1 < n < = 2^31 )

输出

 输出分解的总数

样例输入

12

样例输出

8


解题思路:暴力递归求解,但因为随着n的增大,所用时间会越来越多,所以必须剪枝,一共wa了2次才ac,下面附上所有的代码。

第一次wa(直接暴力递归无任何剪枝):

#include<bits/stdc++.h>
using namespace std;
 
int n,cnt=0;
 
void dfs(int x)
{
    if(x==n){cnt++;return;}
    else if(x>n)return;
    for(int i=2;i<=n/2;++i)
    {
        if(x*i>n)break;
        dfs(x*i);
    }
}
 
int main()
{
    while(cin>>n)
    {
        cnt=0;
        dfs(1);
        cout<<cnt+1<<endl;
    }
    return 0;
}

第二次wa(加入了素数的判定):

#include<bits/stdc++.h>
using namespace std;
 
int n,cnt=0;
 
bool is_prime(int x)//判定n是否是素数
{
    int j=sqrt(x);
    for(int i=2;i<=j;++i)
    {
        if(x%i==0)return false;
    }
    return true;
}
 
void dfs(int x)
{
    if(x==n){cnt++;return;}
    else if(x>n)return;
    for(int i=2;i<=n/2;++i)
    {
        if(x*i>n)break;
        dfs(x*i);
    }
}
 
int main()
{
    while(cin>>n)
    {
        cnt=0;
        if(is_prime(n))cout<<"1"<<endl;//n是素数的话直接输出1
        else
        {
            dfs(1);
            cout<<cnt+1<<endl;
        }
    }
    return 0;
}

第三次ac(先找出n的所有因子保存到一个数组,并且在递归前先判定x*a[i]是否是n的因数):

#include<bits/stdc++.h>
using namespace std;
 
int n,cnt,j;
int a[99999];
 
bool is_prime(int x)
{
    int j=sqrt(x);
    if(x==1||x==2)return true;
    else for(int i=2;i<=j;++i)
    {
        if(x%i==0)return false;
    }
    return true;
}
 
void dfs(int x)
{
    if(x==n){cnt++;return;}
    else if(x>n)return;
    for(int i=0;i<j;++i)
    {
        if(x*a[i]>n)break;
        if(n%(x*a[i])==0)dfs(x*a[i]);//判定x*a[i]是否是n的因数
    }
}
 
int main()
{
    while(cin>>n)
    {
        cnt=0,j=0;
        memset(a,0,sizeof(a));
        if(is_prime(n))cout<<"1"<<endl;
        else
        {
            for(int i=2;i<=n/2;++i)//保存n的每个因子
            {
                if(n%i==0)
                {
                    a[j]=i;
                    j++;
                }
            }
            dfs(1);
            cout<<cnt+1<<endl;
        }
    }
    return 0;
}

 



posted @ 2018-07-12 11:52  皮皮嘉  阅读(587)  评论(0编辑  收藏  举报