PAT_甲级_1059 Prime Factors (25分) (C++)【分解因数/规格化输出】

目录

1,题目描述

 题目大意

2,思路

数据结构

算法

3,AC代码

4,解题过程

第一搏

第二搏


1,题目描述

PAT_甲级_1059 Prime Factors (25分) (C++)【分解因数/规格化输出】_第1张图片

Sample Input:

97532468

 

Sample Output:

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

 题目大意

看例子很容易理解,就是分解因数;

 

2,思路

数据结构

  • map ans:key为因数factor,value为因数的几次幂,比如当输入为1024时,ans中存放的即ans[2] = 10;

算法

  1. 从2开始,逐个试探因数factor,若factor为因数,则不断除以factor,并ans[factor]++。
    for(int factor = 2; factor <= num; factor++){   //不需要考虑factor是否为质数
            while(num % factor == 0){                   //比如当in不能被2整除时 它也不会被4整除
                if(flag == 0){
                    flag = 1;
                    firstFac = factor;
                }
                ans[factor]++;
                num /= factor;
            }
        }
  2. 当输入in为1时,不会放入ans中,需要特殊处理:
    if(in == 1){                                    //输入为1时 需要特殊处理
            cout<<1;
            return 0;
        }

     

  3. 由于map的性质,此时ans中 已经将因数以及因数的次幂,按照因数(key)的大小排列好了,接下来只需规范输出即可(firstFac首个因子,其前不加*):
    for(auto it : ans){
            if(it.first == firstFac){
                if(it.second == 1)                      //第一个因子区别输出
                    printf("%d", it.first);
                else
                    printf("%d^%d", it.first, it.second);
            }else{
                if(it.second == 1)
                    printf("*%d", it.first);
                else
                    printf("*%d^%d", it.first, it.second);
            }
        }

     

 

3,AC代码

#include
#include
#include
#include
#include
#include
using namespace std;

int main(){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE

    map ans;
    int in, num;
    cin>>in;
    num = in;

    int flag = 0;
    int firstFac;                                   //记录第一个因子 便于规范输出
    for(int factor = 2; factor <= num; factor++){   //不需要考虑factor是否为质数
        while(num % factor == 0){                   //比如当in不能被2整除时 它也不会被4整除
            if(flag == 0){
                flag = 1;
                firstFac = factor;
            }
            ans[factor]++;
            num /= factor;
        }
    }

    printf("%d=", in);
    if(in == 1){                                    //输入为1时 需要特殊处理
        cout<<1;
        return 0;
    }
    for(auto it : ans){
        if(it.first == firstFac){
            if(it.second == 1)                      //第一个因子区别输出
                printf("%d", it.first);
            else
                printf("%d^%d", it.first, it.second);
        }else{
            if(it.second == 1)
                printf("*%d", it.first);
            else
                printf("*%d^%d", it.first, it.second);
        }
    }
    return 0;
}

 

4,解题过程

第一搏

万恶的测试点3

PAT_甲级_1059 Prime Factors (25分) (C++)【分解因数/规格化输出】_第2张图片

第二搏

测试点3:当输入为1.。。。特殊处理即可。

PAT_甲级_1059 Prime Factors (25分) (C++)【分解因数/规格化输出】_第3张图片

 

 

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