POJ 1365 -- Prime Land

题目大意:题目给出一个整数的质数分解展开形式,给出每一个质因数及对应的指数。

例如样例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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值