题目链接:这里
题意:给你一个数,你需要拆成素数因子的形式 比如123 = 1 + 1*2+4*2*3*5
拆成n = a0 + a1* p0 + a2* p0* p1 + a3* p0* p1* p2 + … 的形式
给你一个数,问你怎么拆
解法:
贪心去拆就好了,素数乘积从大到小不断考虑
如果超过就减去就好了
然后不断贪

//UVALive 4225

#include <bits/stdc++.h>
using namespace std;
const int maxn = 30;
bool flag[maxn];
vector <int> P;
stack <int> stk;
void pre_deal(){
    memset(flag, 0, sizeof(flag));
    for(int i = 2; i < maxn; i++){
        if(!flag[i]){
            P.push_back(i);
            for(int j = i; j < maxn; j += i){
                flag[j] = true;
            }
        }
    }
}
int main(){
    pre_deal();
    long long n;
    while(cin >> n){
        if(n == 0) break;
        long long ans = 1;
        for(int i = 0; i < P.size(); i++){
            ans *= P[i];
        }
        while(!stk.empty()) stk.pop();
        long long pre = n;
        for(int i = P.size()-1; i >= 0; i--){
            stk.push(n/ans);
            n = n%ans;
            ans /= P[i];
        }
        printf("%lld =", pre);
        int flag = 1;
        if(n){
            printf(" 1");
            flag = 0;
        }
        for(int i = 0; i < P.size(); i++){
            if(stk.top() == 0){
                stk.pop();
                continue;
            }
            if(!flag){
                printf(" +");
            }
            flag = 0;
            printf(" %d", stk.top()); stk.pop();
            for(int j = 0; j <= i; j++){
                printf("*%d", P[j]);
            }
        }
        printf("\n");
    }
    return 0;
}