上海交大OJ 分解质因数

每一个大于等于2的自然数,均可写成一个或多个质数的乘积,例如:

2=2

20=2*2*5

这种将一个整数分割成若干个质数之积的操作叫做分解质因数。现在,给你一个整数N,请你编写一个程序,对其分解质因数。

Input Format

输入为一行,正整数N,保证1<N<2147483647 1<N<2147483647 。

Output Format

输出N的质因数分解形式,格式为 N=P1(E1)P2(E2)P3(E3).... 其中,P1、P2、P3、……为组成N的各个质因子,

满足P1 < P2 < P3 < ...;E1、E2、E3、……分别为P1、P2、P3、……在N中的指数。

例如:

20=2*2*5

应该输出成:

20=2(2)5(1)

Hint

N的大于sqrt(N)的质因子至多有一个。(sqrt(n)指N的开方取整)

Sample Input

20

Sample Output

20=2(2)5(1)

查找质数函数

//查找质数
void find_prime(int maxn){
    //k记录第几个质数
    int k = 0;
    //2 - 1001 之间的质数
    for(int i = 2;i <= maxn;i++){
        if(vis[i] == false){
            //记录质数
            prim[k++] = i;
            //去除非质数
            for(int j = i * 2;j <= maxn;j += i)
                vis[j] = true;
        }
    }
}

 代码:

#include <iostream>
#include <cstdio>
#include <set>
#include <map>

using namespace std;

const int m = 7001;

int prim[m] = {0};
bool vis[m][m] = {false};

map<long long,int> sumz;

set<int> q;
//查找质数
void find_prime(int maxn){
    //k记录第几个质数
    int k = 0;
    //2 - 1001 之间的质数
    for(int i = 2;i <= maxn;i++){
        if(vis[i/m][i % m] == false){
            //记录质数
            prim[k++] = i;
            //去除非质数
            for(int j = i * 2;j <= maxn;j += i)
                vis[j / m][j % m] = true;
        }
    }
}

int main(int argc, char const *argv[]) {
    //待求解数字
    int N;

    scanf("%d",&N);

    //记录N最初值 在输出时用
    int in = N;

    //返回质数数组
    find_prime(N);

    //N = 1 说明求解结束
    while (N != 1) {
        //prim <= N -- N的质数因子永远小于等于N
        for(int i = 0;prim[i] <= N;i++){
            //是其因子
            if(N % prim[i] == 0){
                //记录因子出现次数
                sumz[prim[i]]++;
                //q 存储 排序去重
                q.insert(prim[i]);
                //对N进行规模减小
                N /= prim[i];
                break;
            }
        }
    }

    int i = 0;
    printf("%d=",in);

    for(auto i:q){
        printf("%d",i);//输出因子
        printf("(%d)",sumz[i]);//输出因子的指数
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/WX_1218639030/article/details/84106999
今日推荐