您的位置:首页 > 其它

POJ 1365 -- Prime Land

2015-01-06 09:17 267 查看
题目大意:题目给出一个整数的质数分解展开形式,给出每一个质因数及对应的指数。

例如样例2: 5 1 2 1 = 5^1*2^1 = 10

根据所给的质数分解展开形式求出原数n,并求出n-1的展开形式,也像样例给的形式,质因数逐渐减小的形式。

思路分析:先进行筛素数,再用n逐一对质数试除,求得质因数,并在此过程中记录求得质因数的指数。

代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
const int maxn=100000;
int prime[maxn/3];
int flag[maxn];
long long p[maxn],e[maxn],cnt1,cnt2;
int cnt;
void Prime(){
cnt=0;
memset(flag,0,sizeof(flag));
for(int i=2;i<maxn;i++){
if(!flag[i])
prime[cnt++]=i;
for(int j=0;i*prime[j]<maxn;j++){
flag[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
void f(long long n){
memset(e,0,sizeof(e));
cnt1=0,cnt2=0;
for(int i=0;i<cnt&&n>1;i++){
if(n%prime[i]==0){
p[cnt1++]=prime[i];
while(n%prime[i]==0){
n/=prime[i];
e[cnt2]+=1;
}
cnt2++;
}
}
if(n>1){
p[cnt1++]=n;
e[cnt2++]++;
}
printf("%lld %lld",p[cnt1-1],e[cnt2-1]);
for(int i=cnt1-2;i>=0;i--)
printf(" %lld %lld",p[i],e[i]);
printf("\n");
}
int main(){
Prime();
int a,b;
while(scanf("%d",&a)==1){
if(a==0)
break;
long long n;
char c;
scanf("%d%c",&b,&c);
double n1=pow(a*1.0,b*1.0);
n=(long long)n1;
while(c!='\n'){
scanf("%d%d%c",&a,&b,&c);
double n1=pow(a*1.0,b*1.0);
n*=(long long)n1;
}
f(n-1);
}
}


还可以运用#include<string>下的string ,#include<stream>下的stringstream进行数据输入:

具体用法连接:http://blog.csdn.net/xw20084898/article/details/21939811
http://acm.nudt.edu.cn/~twcourse/libtech.html
int main(){
Prime();
string s;
stringstream ss;
long long n;
while(getline(cin,s)){
if(s[0]=='0')
break;
n=1;
ss.clear();
ss.str(s);
int a,b;
while(ss>>a>>b){
double n1=pow(a*1.0,b*1.0);
n*=(long long)n1;
}
f(n-1);
}
}


int main(){
Prime();
string s;
long long n;
while(getline(cin,s)){
if(s[0]=='0')
break;
n=1;
istringstream in(s);
int a,b;
while(in>>a>>b){
double n1=pow(a*1.0,b*1.0);
n*=(long long)n1;
}
f(n-1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: