NOI 1.13.22 因子分解 题解(C++)

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);
}

本题的讲解到此结束。

发布了20 篇原创文章 · 获赞 1 · 访问量 468

猜你喜欢

转载自blog.csdn.net/jerry20183/article/details/104235481