/*******
英雄会15题
对于整数n,n的阶乘表示为n!定义如下 0! = 1 n! = n * (n - 1)! 给定n和m,问n!是否是m的倍数?
n和m全在32位整数范围内,m非0。 返回1和0表示整除和不整除。
挑战规则:
main函数可不用完成(3s)。
挑战规则:
main函数可不用完成(3s)。
注释:
开始,用求最大公约数的方法,对每个i= 2~N求i和 m的最大公约数,直到m==1 结果,时间复杂度太高,超时
后来才想到,用因式分解的方法,果然没有超时,这里用了一个技巧,即用了n!里有几个factor的方法?
这是求n!末尾有几个0个问题,衍生的技巧.
*****/
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
//#include<mem.h>
#define ByteBits 8
struct factors{
int factor,count;
};
struct factors
factor[32];
int factor_sep(int
n){
int k
= 0;
int i
= 0;
memset(factor
,0,sizeof(int)*
ByteBits * sizeof(
struct factors));
if(n==0)return
0;
if(n
== 1){
factor[0].count++;
factor[0].factor
= 1;
return 1;
}
for(i
=2;i<sqrt(n);i++)
{
while (n
% i ==
0 ){
n /=i;
factor[k].count++;
}
if(factor[k].count
>0)
{
factor[k].factor
= i;
k++;
}
if(n
==1)break;
}
if(n
> 1){
factor[k].count++;
factor[k].factor
= n;
k++;
}
return k;
}
int divides
(int n,int
m)
{
int i
= 0;
int k
= 0;
int n0
= n;
int nc
= 0;
int nk
= 0;
if(n
== 0)return
0;
k =
factor_sep(m);
while(i
< k){
n0 =
n;
nc=0;
while(n0
> factor[k].factor){
nc
+= n0/ factor[k].factor;
if(nc>=
factor[k]
.count ){
nk++;
break;
}
}
i++;
}
return k
== nk;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
printf("%d",divides(4,12));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加