NOI 1.13.22 因子分解 题解(C++)
今天的题解有关递归和质数,尽管作者很讨厌递归,但还是发现递归简单,还是用了递归,此时此刻,作者只想说:我太难了~~
不说了,说多了都是泪啊,请听题:
NOI 1.13.22:因子分解
总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个数,输出其素因子分解表达式。
输入
输入一个整数 n (2 <= n < 100)。
输出
输出该整数的因子分解表达式。
表达式中各个素数从小到大排列。
如果该整数可以分解出因子a的b次方,当b大于1时,写做 a^b ;当b等于1时,则直接写成a。
样例输入
60
样例输出
2^2*3 *5//不含空格
首先你可以看到加粗的部分是2<=n<=100,so我们可以列一个一到一百的质数表,方便使用,可以做一个.cpp打印质数表。懒得写的也可以直接使用我下面打印的质数直接复制进去:
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97
看看递归的伪代码吧:
//counter,用作表示几次幂
void fill(int n/*当前数*/,int num/*用于表示在考虑第几个质数*/){
if(n == 1){//不可再分解
if(counter == 1){//为一次幂
cout<<z[num];
}else{//其他次幂
cout<<z[num]<<"^"<<counter;
}
return ;
}
if(/*n这个数不能被当前这个质数整除*/){
prt(num);
counter = 0;
//考虑下一个
}else{//可以整除
counter++;
fill(n/z[num],num/*在这里num千万不能+1,+1就只剩1次幂了,会死循环*/);
}
}
知道为什么num不能+1了吧。
好了,完整代码如下:
#include<bits/stdc++.h>
using namespace std;
int z[26] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
int counter;
void prt(int num){
if(counter == 0){
return ;
}else if(counter == 1){
cout<<z[num]<<"*";
return ;
}else{
cout<<z[num]<<"^"<<counter<<"*";
}
}
void fill(int n,int num){
if(n == 1||num == 25){
if(counter == 1){
cout<<z[num];
}else{
cout<<z[num]<<"^"<<counter;
}
return ;
}
if(n%z[num]!=0){
prt(num);
counter = 0;
fill(n,num+1);
}else{
counter++;
fill(n/z[num],num);
}
}
int main(){
int n;
cin>>n;
fill(n,0);
}
本题的讲解到此结束。