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