CSDN-阶乘与整数

来源:互联网 发布:人工智能客服开源系统 编辑:程序博客网 时间:2024/05/16 08:42
题目详情

对于整数n,n的阶乘表示为n!定义如下

0! = 1

n! = n * (n - 1)!

给定n和m,问n!是否是m的倍数?

n和m全在32位整数范围内,m非0。

返回1和0表示整除和不整除。

  
答题说明
main函数可不用完成。
 
 
题目分析:


1、判断n和m的大小。如果m<=n  直接可以整除;m>n  如果m是素数,不可以整除。否则根据下面判断

2、把从2到n的数存入a数组中

3、对m分解质因数,然后把因子依次存入b数组中

4、对a数组从头开始,对b数组依次求余。模为0则把相对应b数组中的数赋为0,a数组中的数进行整除。(具体实现看代码吧!)

5、检测b数组中的值是否全是0,若是,可以整除。 不是,则不可以整除。

排除特例情况,其实就是一种分式约分,如果m可以被完全约分,肯定是可整除
 
#include<stdio.h>#include<math.h>#include<stdlib.h>int comp(int m){    int i;    if(m<2 || m%2==0)        return 0;    for(i=3; i<=sqrt(m); i+=2)        if(m%i==0)            return 0;    return 1;}int divides (int n,int m){    int *pn=NULL, *pm=NULL;    int root=sqrt(m);    int i,j,x,k=0;    if(n>=m)        return 1;//代表可以整除     if(comp(m))        return 0;    pn=(int*)malloc(n*sizeof(int));    pm=(int*)malloc(root*sizeof(int));    x=m;    for(i=2; i<=n; i++)        pn[i-1]=i;    for(i=2; i<=x;)//分解质因数,方法好     {        if(x%i==0)        {            pm[k]=i;            x/=i;            k++;        }        else        {            i++;        }    }    for(j=0; j<k; j++)    {        for(i=1; i<n; i++)        {            if(pn[i]%pm[j]==0)            {                pn[i]/=pm[j];                pm[j]=0;                break;            }        }    }    for(j=0; j<k; j++)    {        if(pm[j])        {            free(pn);            free(pm);            return 0;        }                }         free(pn);    free(pm);    return 1;}//start 提示:自动阅卷起始唯一标识,请勿删除或增加。int main(){        printf("%d",divides(6,9));}//end //提示:自动阅卷结束唯一标识,请勿删除或增加。

0 0
原创粉丝点击