[模板]合数分解

来源:互联网 发布:java输出语句换行符 编辑:程序博客网 时间:2024/05/16 19:53

合数分解模板:
顾名思义,给定一个合数,完成以下功能:
将该合数分解成质因数,统计出出现不同的质因数的个数,分别出现过的质因数为哪几个,以及出现过的质因数的数量。

const int MAXN =10010;int prime[MAXN+1];void getprime(){    memset(prime,0,sizeof(prime));    for(int i = 2; i<=MAXN;i++)    {        if (!prime[i]) prime[++prime[0]]=i;        for(int j = 1;j<=prime[0] &&prime[j] <= MAXN/i;j++)        {            prime[prime[j]*i] = 1;            if(i % prime[j] ==0) break;        }    }}long long factor[100][2];int fatCnt;int getFactors(long long x){    fatCnt = 0;    long long tmp = x;    for(int i = 1; prime[i]<=tmp/prime[i];i++)    {        factor[fatCnt][1] = 0;        if(tmp % prime[i] == 0)        {            factor[fatCnt][0] = prime[i];            while(tmp%prime[i]==0)            {                factor[fatCnt][1]++;                tmp /= prime[i];            }            fatCnt++;        }    }    if (tmp != 1)    {        factor[fatCnt][0] = tmp;        factor[fatCnt++][1] = 1;    }    return fatCnt;}

在该函数中需要先使用到素数表,prime[]保存的是2,3,5,7等从小到大的素数,素数表的求法在模板中也写下来了。

统计完毕后,factor[fatCnt][0]存的是分解该质因数后出现过的质数,factor[fatCnt][1]存的是分解质因数后该质数出现的次数。返回值fatCnt是指总共出现过的fatCnt种类。

根据模板编写主函数如下:

    getprime();    cout<<getFactors(3867500)<<endl;    for(int i =0;factor[i][0]!=0;i++)        cout<<factor[i][0]<<" ";    cout<<endl;    for(int i =0;factor[i][1]!=0;i++)        cout<<factor[i][1]<<" ";    cout<<endl;

输出结果为

52 5 7 13 172 4 1 1 1

说明该合数由5个不同的质数组成,
质数分别是2、5、7、13、17。
每个质数的个数分别为2、4、1、1、1。

(附:分解因式):
3867500 = 2*2*5*5*5*5*7*13*17

factor[0…n][0]
2,5,7,13,17,0,0,0,0,……
factor[0…n][1]
2,4,1,1,1,0,0,0,……

其他情况以此类推,可以自己测试一下其他的数据。

0 0
原创粉丝点击