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