【Algorithm】关于n!被整除的问题【算法实现】

来源:互联网 发布:excel03显示重复数据 编辑:程序博客网 时间:2024/05/22 01:35

传统的方法:

//输入:int a, n;//输出:int i;//算法效果:求最大的i, 使得n!(n的阶乘)可以被a^i(a的i次方)整除,而不能被a^(i+1)(a的i+1次方)整除。#include<iostream.h>#include<string.h>double fac(int n);int inline fun1(int a,int n);//int fun2(int a,int n);void main(){    int n;    int a;    cout<<"n=";cin>>n;    cout<<"a=";cin>>a;    cout<<"最大的fun1 i="<<fun1(a,n)<<endl;}//阶乘计算double fac(int n){    if(n==0)        return 1;    else    {        double re=1;        for(int i=1;i<=n;i++)        {            re=re*i;        }        return re;    }}int inline fun1(int a,int n){    if(a==1)        return -1;//此时最大的i为无穷大    int p=0;    int sum=fac(n);    int a_p=a;     while(1)    {        if((sum%(a_p))==0)        {            p++;            a_p=a_p*a;        }        else        {            break;        }    }    return p;}

使用质数分解实现(非传统方法):


//输入:int a, n;//输出:int i;//算法效果:求最大的i, 使得n!(n的阶乘)可以被a^i(a的i次方)整除,而不能被a^(i+1)(a的i+1次方)整除。#include<iostream.h>#define SIZE 100struct PrimeItem{    int prime;//质数值    int count;//质数数量};int* prime_factors(int n);//分解质因数PrimeItem* GetItemArray(int n);//获取质数item链表int Local(PrimeItem array[],int x);//元素定位int MaxJ(int *prime,PrimeItem *arrayitem);void main(){    int n,a;    cout<<"n=";cin>>n;    cout<<"a=";cin>>a;        int *prime=prime_factors(a);    PrimeItem *arrayitem=GetItemArray(n);     cout<<"MaxJ="<<MaxJ(prime,arrayitem)<<endl;    }//===============分解质因数================// int* prime_factors(int n){    int *array=new int[SIZE];    int index=0;    for(int i=2;i<=n;i++)    {        while(n!=i)        {            if(n%i==0)            {                array[index]=i;                index++;                n=n/i;            }            else                 break;        }    }    array[index]=n;//    index++;    array[index]=0;//设置结束标志    return array;}PrimeItem* GetItemArray(int n){    PrimeItem *arraylist=new PrimeItem[SIZE];    int *temp=new int[SIZE];    int i,j;    int currentindex=0;    int find;    for(i=0;i<SIZE;i++)    {        arraylist[i].count=0;        arraylist[i].prime=0;    }    for(i=2;i<=n;i++)    {        temp=prime_factors(i);        j=0;        while(temp[j]!=0)        {            find=Local(arraylist,temp[j]);            if(find==-1)            {                //没有找到                arraylist[currentindex].prime=temp[j];                arraylist[currentindex].count=1;                currentindex++;            }            else            {                //该质数已经存在于质数item数组中                //count+1                arraylist[find].count++;            }            j++;        }    }    return arraylist;}int MaxJ(int *prime,PrimeItem *arrayitem){    int i;    int count=0;    int find;    int condition=1;    while(condition)    {        for(i=0;prime[i]!=0;i++)        {             find=Local(arrayitem,prime[i]);            if(find==-1)//没有找到质数元素            {                             break; //结束循环            }            else            {                arrayitem[find].count--;                if(arrayitem[find].count==0)                {                                    arrayitem[find].prime=1;//置1                                    }            }        }        if(prime[i]==0&&i!=0)        {             count++;            //condition=1;//继续循环        }        else        {            condition=0;        }    }    return count;}int Local(PrimeItem *array,int x){    for(int i=0;array[i].prime!=0;i++)    {         if(array[i].prime==x)            return i;    }    return -1;}


0 0
原创粉丝点击