UVA 10392--Factoring Large Numbers

来源:互联网 发布:数据库并发保证一致性 编辑:程序博客网 时间:2024/05/17 23:10

题目概述:整数分解问题

思路分析:任何一个数n都可以写成n=p1^a1*p2^a2*...*pm^am(其中p1,p2,..,pm为n的素因子)

方法一:

把所有可能的因数拿来试除,注意一个合数n的最大素因子不会超过sqrt(n)(除了n本身外);

#include<stdio.h>#include<math.h>void f(long long n){    for(long long i=2;i<=(int)sqrt(n+0.5);i++){        while(n%i==0){            n=n/i;            for(int j=0;j<4;j++)                printf(" ");            printf("%lld\n",i);        }    }    if(n>1){        for(int i=0;i<4;i++)            printf(" ");        printf("%lld\n",n);    }}int main(){    long long n;    while(scanf("%lld",&n)==1){       if(n<0)           break;       f(n);       printf("\n");    }    return 0;}
方法二:

先建立素数表,再用输入的数对素数表依次试除;

这里建立的素数表使用了线性筛选法,关键的思想是每个合数必有一个最小素因子,保证每个合数都是被它的的最小素因子筛去,并只筛依一次,防止合数重复访问

#include<stdio.h>#include<math.h>#include<string.h>const int maxn=1000000;int prime[maxn/3];int flag[maxn];int cnt;void Prime(){    cnt=0;    memset(flag,0,sizeof(flag));    flag[0]=1;    flag[1]=1;    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){    for(int i=0;i<cnt;i++){        if(n==1||n<prime[i])           break;        while(n%prime[i]==0){            n/=prime[i];            printf("    %d\n",prime[i]);        }    }    if(n>1) printf("    %lld\n",n);}int main(){    Prime();    long long n;    while(scanf("%lld",&n)==1){       if(n<0)           break;       f(n);       printf("\n");    }    return 0;}


0 0
原创粉丝点击