/*******
英雄会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 //提示:自动阅卷结束唯一标识,请勿删除或增加