PAT甲级刷题记录——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 = p​1​​​k1×p​2​​ ​k​2​​ ​​ ×⋯×p​m​​​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 =p​1​​ ^k​1​​ *p​2​​ ^k​2​​ **p​m​​ ^k​m​​ , where p​i​​ '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​ , k​i​​ is 1 and must NOT be printed out.

Sample Input:

97532468

Sample Output:

97532468=2^2*11*17*101*1291

思路

这题就是找一个数的所有质因子,以样例来说,97532468有2个2,有1个11,有1个17,有1个101,有1个1291,然后输出的格式是次方之间相乘的形式(但是题目说了,1个时候不输出1次方,因此样例输出后面都没有次方符号了)。

处理这种问题很简单,先用筛法打表,然后在素数表里找N的因子,如果找到了,那么先记录当前的因子,然后不断除这个因子(这是为了看看这个因子有多少个,比如样例中因子2有2个,因此一定要反复除同一个因子)。然后,如果不能再整除当前这个因子的话,就前往找下一个素因子(这里N不用变回原来的N,除了就除了,没事的)。最后,如果N已经被除到只有1了,那么break掉即可~

注意点】:因为素数是从2开始的,但是给出的N是在int型范围内的正整数(long int就是int),因此还有1的情况,这个时候特判输出就行了(输出1=1)。

PS】PTA的网页编译器界面好像更新了hhh,终于不是前几天的纯黑色文本了,好看多了哈~

代码

#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 100010;
struct factor{
    int num;
    int cnt;
}result[maxn];
int prime[maxn], pNum = 0;
bool p[maxn] = {false};
void FindPrime(){
    for(int i=2;i<maxn;i++){
        if(p[i]==false){
            prime[pNum++] = i;
            for(int j=i+i;j<maxn;j+=i) p[j] = true;
        }
    }
}
int main(){
    FindPrime();
    int N;
    scanf("%d", &N);
    int nowN = N;//保存N的备份,因为下面会变
    int index = 0;
    for(int i=0;i<pNum;i++){
        if(N==1) break;
        if(N%prime[i]==0){
            result[index].num = prime[i];
            while(N%prime[i]==0){
                result[index].cnt++;
                N /= prime[i];
            }
            index++;
        }
    }
    if(nowN==1) printf("1=1");//特判
    else{
        printf("%d=", nowN);
        for(int i=0;i<index;i++){
            if(i==0){
                if(result[i].cnt==1) printf("%d", result[i].num);
                else printf("%d^%d", result[i].num, result[i].cnt);
            }
            else{
                if(result[i].cnt==1) printf("*%d", result[i].num);
                else printf("*%d^%d", result[i].num, result[i].cnt);
            }
        }
    }
    return 0;
}

你可能感兴趣的:(PAT甲级)