1059. Prime Factors (25)

题目如下:

Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1^k1 * p2^k2 *…*pm^km.

Input Specification:

Each input file contains one test case which gives a positive integer N in the range of long int.

Output Specification:

Factor N in the format N = p1^k1 * p2^k2 *…*pm^km, where pi's are prime factors of N in increasing order, and the exponent ki is the number of pi -- hence when there is only one pi, ki is 1 and must NOT be printed out.

Sample Input:
97532468
Sample Output:
97532468=2^2*11*17*101*1291


题目的关键是设计出求下一个素数的函数,注意第一个素数是2。

定义当前素数prime,当前系数exp,初值prime=2,exp=0,如果输入的值N能整除prime,则把exp++,并且N=N/prime,如果N=1,说明当前系数处理完毕,并且整个数也分解完毕,记录当前prime和exp;如果N不能整除prime,则判断exp是否为0,不为0说明对于这个prime被分解过exp次,也应该记录prime和exp然后把exp置0,然后找到下一个prime继续处理。

最后输出所有记录的值即可,用结构体和vector结合可以方便记录prime和exp。

注意输入的值为1时,应该特殊处理。

#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;

typedef unsigned long ulong;

struct Node{
    ulong p;
    ulong k;

    Node(int _p, int _k) : p(_p), k(_k) {}
};

ulong nextPrime(ulong now){
    if(now <= 1) return 2;
    bool isPrime;
    while(1){
        now++;
        isPrime = true;
        for(ulong factor = 2; factor < now; factor++){
            if(now % 2 == 0) { isPrime = false; break; }
        }
        if(isPrime) return now;
    }

}

int main()
{
    ulong prime = 2;
    vector<Node> nodes;
    ulong num;
    cin >> num;
    ulong exp = 0;
    ulong originNum = num;
    if(num == 1){
        cout << "1=1" << endl;
        return 0;
    }

    while(num != 1){
        if(num % prime == 0){
            num /= prime;
            exp++;
            if(num == 1) nodes.push_back(Node(prime,exp));
        }else{
            if(exp != 0){
                nodes.push_back(Node(prime,exp));
                exp = 0;
            }
            prime = nextPrime(prime);
        }
    }
    ulong p,k;
    printf("%ld=",originNum);
    for(int i = 0; i < nodes.size(); i++){
        p = nodes[i].p;
        k = nodes[i].k;
        if(k == 1) printf("%ld",p);
        else printf("%ld^%ld",p,k);
        if(i!=nodes.size() - 1) printf("*");
    }
    cout << endl;
    return 0;
}


posted on 2015-07-26 12:32  张大大123  阅读(153)  评论(0编辑  收藏  举报

导航