UVALive 4225 Prime Bases 贪心
2016-01-22 21:29
483 查看
Prime Bases
题目连接:
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2226Descriptionww.co
Given any integer base b >= 2, it is well known that every positive integer n can be uniquely represented in base b. That is, we can writen = a0 + a1* b + a2* b* b + a3* b* b* b + ...
where the coefficients a0, a1, a2, a3, ... are between 0 and b-1 (inclusive).
What is less well known is that if p0, p1, p2, ... are the first primes (starting from 2, 3, 5, ...), every positive integer n can be represented uniquely in the "mixed" bases as:
n = a0 + a1* p0 + a2* p0* p1 + a3* p0* p1* p2 + ...
where each coefficient ai is between 0 and pi-1 (inclusive). Notice that, for example, a3 is between 0 and p3-1, even though p3 may not be needed explicitly to represent the integer n.
Given a positive integer n, you are asked to write n in the representation above. Do not use more primes than it is needed to represent n, and omit all terms in which the coefficient is 0.
Input
Each line of input consists of a single positive 32-bit signed integer. The end of input is indicated by a line containing the integer 0.Output
For each integer, print the integer, followed by a space, an equal sign, and a space, followed by the mixed base representation of the integer in the format shown below. The terms should be separated by a space, a plus sign, and a space. The output for each integer should appear on its own line.Sample Input
123456
123456
0
Sample Output
123 = 1 + 12 + 4235456 = 123 + 1235 + 22357
123456 = 123 + 6235 + 42357 + 1235711 + 4235711*13
Hint
题意
给你一个数,你需要拆成素数因子的形式比如123 = 1 + 1*2+4*2*3*5
拆成n = a0 + a1* p0 + a2* p0* p1 + a3* p0* p1* p2 + ...
的形式
给你一个数,问你怎么拆
题解:
贪心去拆就好了让,素数乘积从大到小不断考虑如果超过就减去就好了
然后不断贪
代码
#include<bits/stdc++.h> using namespace std; const int MAXN = 30; bool flag[MAXN]; vector<int> P; void GetPrime_1() { int i, j; memset(flag, false, sizeof(flag)); for (i = 2; i < MAXN; i++) if (!flag[i]) { P.push_back(i); for (j = i; j < MAXN; j += i) flag[j] = true; } } string get(int p) { string k; while(p) { k+=(char)(p%10+'0'); p/=10; } reverse(k.begin(),k.end()); return k; } int main() { GetPrime_1(); 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]; long long pre = n; stack<int> S; for(int i=P.size()-1;i>=0;i--) { S.push(n/ans); n=n%ans; ans/=P[i]; } printf("%lld =",pre); int first = 1; if(n) { printf(" 1"); first = 0; } for(int i=0;i<P.size();i++) { if(S.top()==0) { S.pop(); continue; } if(!first) printf(" +"); first=0; printf(" %d",S.top()); S.pop(); for(int j=0;j<=i;j++) { printf("*%d",P[j]); } } printf("\n"); } }
相关文章推荐
- 怎样在nat方式的虚拟机下做ssh连接
- 关于ionic中的https无法访问的问题
- 无法将网络更改为桥接状态
- C++指定小数位输出
- R语言学习笔记(1):R是什么
- [Java基础] 深入jar包:从jar包中读取资源文件
- 函数重载
- 实现单元格的插入与删除
- 总结与目标
- 关于解决Windows server系统用户无法远程的问题
- python--datetime&time
- iOS 【Multithreading-线程间通信(NSOperation)/最大并发数/操作依赖/NSOperation优先级】
- CLAPACK安装问题解决及应用举例
- 第16章 模板与泛型编程
- 2235 机票打折
- LaTex中插入花体字母
- 笑死:Welcome to Skip Thompson's Homepage
- hdfs java.io.IOException: Mkdirs failed to create
- 网页制作学习2----实现对象的传递
- UVALive 4223 Trucking 二分+spfa