UVALive 4225 Prime Bases 贪心

来源:互联网 发布:喝咖啡的利弊 知乎 编辑:程序博客网 时间:2024/04/30 09:02

题目链接:这里
题意:给你一个数,你需要拆成素数因子的形式 比如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;}
0 0
原创粉丝点击