1. 程式人生 > >百練 / 2017研究生推免上機考試 A:因子分解

百練 / 2017研究生推免上機考試 A:因子分解

注:百練上已經結束的比賽只能看到題目但不能提交。但其實百練上所有比賽的題目都是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<stdio.h>
#include<map>
#include<string>
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<int,int> fenJie;            // 不像java,C++例項化map的時候不要new
    map<int,int>::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;
}