题目大意:
给出一个int范围的整数,按照从小到大的顺序输出其分解为质因数的乘法算式。
算法思路:
此题考察的是质因子分解的内容,对于每一个质因子我们使用结构体Factor进行存储,其中保存了因子和出现的次数。接下来就是获取数字N的每一个质因子.
获取方法如下:
首先使用prime_table
保存$10^5$以内的所有素数,然后遍历每一个在2和根号N之间的素数prime_table[i]
,只要N%prime_table[i]==0
,说明prime_table[i]
为N的一个质因子,然后只要prime_table[i]
还是N的因子,就讲对于的次数count
加一,同时N除以prime_table[i]
,当prime_table[i]
不在是N的因子的时候,让不同因子的数目index_factor
加一即可。同时由于对于一个数N,最多只有一个大于根号N的因子,也就是说,在2到根号N之间的所有因子都已经处理完毕后,N依然不为1,说明还有一个大于根号N的因子,此时需要记录该因子(其实就是当前的N)和次数(1)。
注意点:
1、对于N等于1的时候没法分解,需要特判输出,测试点3考察。
2、由于从2开始的素数到第11个素数的时候,所有素数的累乘就超过了int的返回,所以factor数组开到10就行了。
提交结果:
AC代码:
#include <cstdio>
#include <cmath>
using namespace std;
struct Factor{
int prime{};// 因子
int count{};// 个数
}factor[10];
int index_factor = 0;
int prime_table[100000];// 素数表
int num = 0;
bool isPrime(int N){
if(N<4){
return N>1;
}
if(N%6!=1&&N%6!=5) return false;
for (int i = 5; i < sqrt(N*1.0); i+=6) {
if(N%i==0||N%(i+2)==0){
return false;
}
}
return true;
}
// 获取素数表
void init(){
for (int i = 2; i < 100000; ++i) {
if(isPrime(i)){
prime_table[num++] = i;
}
}
}
int main(){
init();
int N;
scanf("%d",&N);
if(N==1){
printf("1=1");// 特判1,测试点3考察
return 0;
}
printf("%d=",N);
int sqrt_N = (int)sqrt(N*1.0);
// 遍历每一个素数
for (int i = 0; i < num&&prime_table[i]<=sqrt_N; ++i) {
if (N%prime_table[i]==0){
factor[index_factor].prime = prime_table[i];
while (N%prime_table[i]==0){
++factor[index_factor].count;
N /= prime_table[i];
}
++index_factor;
}
}
// 还存在一个大于根号N的因子
if(N!=1){
factor[index_factor].prime = N;
++factor[index_factor++].count;
}
for (int j = 0; j < index_factor; ++j) {
printf("%d",factor[j].prime);
if(factor[j].count>1){
printf("^%d",factor[j].count);
}
if(j<index_factor-1) printf("*");
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。