版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/i_CodeBoy/article/details/86531549
题目描述
题目大意
给出一个int范围的整数,按照从小到大的顺序输出其分解为质因数的乘法算式
输入格式
每个输入测试用例包含一个int范围的正整数N
输出格式
按照从小到大的顺序输出其分解为质因数的乘法算式,1判特例。
源代码
#include<cstdio>
#include<cmath>
const long maxn = 10010;
int prime[maxn]; //整数表
int p[maxn] = {0}; //素数表
int pNum = 0; //统计素数个数
void Find_prime(){ //埃氏筛法筛选素数
for(int i = 2; i < maxn; i++){
if( prime[i] == false){
p[pNum++] = i;
for(int j = i + i; j < maxn; j += i){
prime[j] = true;
}
}
}
}
/*
常见打印素数表是使用sqrt()法; O[n * sqrt(0)]
本题使用埃氏筛法; O[nloglogn]
时间复杂度上更优,也适合开大范围
*/
struct factor{ //存放质因子x及其个数cnt
int x, cnt;
}fac[10];
/*
2*3*5*7*11*13*17*19*23*29
已经超过int范围,因此fac数组大小开到10即可
*/
int num = 0;
void Find_factor(int Number){
for(int i = 0; i < pNum; i++){
if(Number % p[i] == 0){
fac[num].x = p[i];
fac[num].cnt = 0;
while(Number % p[i] == 0){
fac[num].cnt++;
Number /= p[i];
}
num++;
}
if(Number != 1){
fac[num].x = Number;
fac[num].cnt = 1;
}
}
}
/*
1.对于一个正整数n来说,存在1和自身之外的因子,那么一定是在sqrt(n)
的左右成对出现。
2.对于一个正整数n来说,若存在[2,n]范围内的质子
则(1)这些质因子全部 <= sqrt(n)
或(2)只存在一个 > sqrt(n)的质因子,其余全部 <= sqrt(n)
*/
int main(){
Find_prime();
int Number;
scanf("%d",&Number);
if(Number == 1){ //根据题意,对1判特例
printf("1=1");
}else{
Find_factor(Number);
for(int i = 0; i < num; i++){ //格式化输出
if(i == 0)printf("%d=",Number);
if(fac[i].cnt == 1){
printf("%d",fac[i].x);
}else{
printf("%d^%d",fac[i].x, fac[i].cnt);
}
if(i != num - 1)printf("*");
}
}
}
/*
检测错误的数据
1、 1=1
2、 7=7
3、 8=2^3
*/