• 因式分解


    问题 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;
    }


  • 相关阅读:
    套件测试
    注解实战aftersuite和beforesuite
    注解实战Beforeclass和Afterclass
    Centos7下安装Mongodb
    java的算法实现冒泡
    注解实战BeforeMethed和afterMethed
    前端 HTML的规范
    前端 HTML标签介绍
    前端 HTML文档 详解
    前端 HTML 简介
  • 原文地址:https://www.cnblogs.com/wjw2018/p/9298797.html
Copyright © 2020-2023  润新知