整數因式分解


1問題的描述:

大於1的正整數n可以分解為:n=x1*x2*x3*…*xm.

例如,當n=12時,共有八種不同的分解式:

12=12

12=62

12=4

12=34

12=322

12=26

12=232

12=223

對於給定的正整數n,編程計算n共有多少種不同的分解式,並輸出分解的結果。

 

2問題的分析:

 對n的每個因子遞歸搜索,當n=12時,從2到12的整數約數有2,3,4,6,12.

即 n%i=0,然后進行n/i操作,按照這樣的方式依次進行,最后得到1的停止操作,計算1的個數就是不同分解式的個數。

3遞歸的形式:

 

4代碼的編寫:

#include <iostream>

using namespace std;

int m=0;//m為記錄分解的種數,初始化為0

 

void solve(int n,int a[],int L)

{

    if (n==1)

    {

           m++;

    }

    else

    {

           for (int i=n;i>=2;i--)

           {

                  if (n%i==0)

                  {

                         a[L]=i;

                         solve(n/i,a,L+1);

                  }

           }

    }

}

 

int main(int argc, char** argv) {

    int n;

    cout<<"請輸入一個整數:"<<endl;

    cin>>n;

    int a[500]={0};

    int L=0;

    cout<<endl;

    solve(n,a,L);

    cout<<endl<<"總共有的分類種數:"<<m<<endl;

}

  5 程序的運行

 

 

 

 

 

程序的運行結果給出了整數的因式分解的種數,但沒有輸出分解的形式。

 

6 代碼的改進及運行的結果

#include <iostream>

using namespace std;

int m=0;//m為記錄分解的種數,初始化為0

 

void prints(int a[],int n)

{

    for (int i=0;i<n;i++)

    {

           cout<<a[i];

           if (i!=n-1)

           cout<<"×";

    }

    cout<<endl;

}

 

void solve(int n,int a[],int L)

{

    if (n==1)

    {

           prints(a,L);

           m++;

    }

    else

    {

           for (int i=n;i>=2;i--)

           {

                  if (n%i==0)

                  {

                         a[L]=i;

                         solve(n/i,a,L+1);

                  }

           }

    }

}

 

int main(int argc, char** argv) {

    int n;

    cout<<"請輸入一個整數:"<<endl;

    cin>>n;

    int a[500]={0};

    int L=0;

    cout<<endl;

    cout<<"因式分解的結果輸出"<<endl;

    solve(n,a,L);

    cout<<endl<<"總共有的分類種數:"<<m<<endl;

}

 

程序的運行結果

 

 

 

 

 

結果分析:輸入一個整數n,就可以得到因式分解的結果以及分解的種數,如上圖所示,完成了實驗的任務。

 

7實驗總結

    先根據問題找出遞推規律,結合教材上的算法和提示,編寫出了因式分解的種數,主要就是輸出分解的結果。於是編寫兩個函數,通過函數調用實現實驗的目的。本次實驗的時間復雜度為.當輸入的數很大時(假設給出的內存空間足夠),運行的時間增長的越來越大。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM