1、最大公约数性质
gcd(a,b)表示求a,b两个数的最大公约数。
(1)gcd(a,b) = gcd(±a,±b)。
(2)gcd(a,b) = gcd(a+kb,b),k为任何整数。
(3)gcd(a,b) = gcd(a mod b , b)。
(4)如果a是非零整数,那么gcd(a,0) = |a|。gcd(0,0)不存在。
根据性质(4)我们可以得到一种求最大公约数的方法,叫辗转相除法,也有称之为欧几里得算法。算法过程如下:
/*
* 辗转相除求最大公约数
* 输入:两个数a和b,两个数不能同时为0
* 输出:a,b的最大公约数
**/
int gcd(int a,int b)
{
int temp;
if(a==0)
{
return b;
}
while(b!=0)
{
temp = b;
b = a % b;
a = temp;
}
}
2、最小公倍数性质
lcm(a,b)表示求a,b两个数的最小公倍数。同样也有lcm(a,b) = lcm(|a| , |b|)。有以下计算公式:
3、习题
1、输入一个整数n,求n!中末尾0的个数。例如,输入3输出0,;输入100输出24;输入1024输出253。
求末尾有几个0,就是求n!中含有几个因子10。因子10又可分为因子5和因子2。因为明显可以看出因子2多于因子5,所以只要知道n!中有几个因子5,就求得答案。
例如对于输入100,1~100中共有 100/5 = 20个数可以被5整除,至少存在20个因子5。其中100、75、50、25可以被5整除两次,换句话说,就是1~100中有100/(5*5) = 4 个数存在有两个因子5,所以至少有 20 + 4 = 24个因子5。但是1~100中有100/(5*5*5) = 0个数存在有三个因子5,也就说一共有24个因子5,100!中末尾0的个数为24。
/*
*输入一个整数n
*输出n!中末尾0的个数
**/
#include<iostream>
using namespace std;
int main()
{
int n,i,nn,count=0;
cin >> n;
i = 5;
while(i<=n)
{
nn = n;
nn = nn/i;
count += nn;
i = i*5;
}
cout << count;
return 0;
}
未完待续。。。。。。