百练 / 2017研究生推免上机考试 A:因子分解

题目来源:http://noi.openjudge.cn/ch0113/22/

注:百练上已经结束的比赛只能看到题目但不能提交。但其实百练上所有比赛的题目都是openjudge题库里的,因此可以在百度上搜索
“#题目描述文字# site: openjudge.cn”

(site: openjudge.cn表示限定在site:openjudge.cn的站点中查询)在openjudge的其他小组中查到这道题目。申请加入该小组就能提交了。

-----------------------------------------------------

因子分解

-----------------------------------------------------

总时间限制

1000ms

 

内存限制

65536kB

描述

输入一个数,输出其素因子分解表达式。

输入

输入一个整数 n (2 <= n < 100)

输出

输出该整数的因子分解表达式。
表达式中各个素数从小到大排列。
如果该整数可以分解出因子ab次方,当b大于1时,写做 a^b ;当b等于1时,则直接写成a

样例输入

60

样例输出

2^2*3*5

 

-----------------------------------------------------

解题思路

由于最大输入在100以内,故可以手动枚举100以内的质数表。
“质数-幂次”的数据结构用map存储。

-----------------------------------------------------

代码

#include
#include
#include
using namespace std;

static int zhiShu[29] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,77,79,83,89,97};

int main()
{
    int n = 0;
    scanf("%d", &n);    
    map fenJie;            // 不像java,C++实例化map的时候不要new
    map::iterator it;
    int oldValue = 1;
    int i=0;
    for (i=0; i<29; i++)
    {
        while(n%zhiShu[i]==0)
        {
            n /= zhiShu[i];
            fenJie[zhiShu[i]]++;    // 不管键值zhiShu[i]在不在map中,都只要这样写就行了,非常方便
        }
        if(n == 1)
        {
            break;
        }
    }
    for (it = fenJie.begin(); it!= fenJie.end(); it++)
    {
        if(it != fenJie.begin())
        {
            printf("*");
        }
        printf("%d", it->first);
        if(it->second != 1)
        {
            printf("^%d", it->second);
        }
    }
    return 0;
}



你可能感兴趣的:(百练OJ/poj)