1

题目大意:

给出一个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就行了。

提交结果:

image.png

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

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得