标题：约数
约数
定义整数a除以整数b(b≠0) 除得的商正好是整数而没有余数，我们就说a能被b整除，或b能整除a。a叫b的倍数，b叫a的约数（或因数）。在大学之前，所指的一般都是正约数。约数和倍数相互依存，不能单独说某个数是约数或倍数。一个数的约数是有限的。范例在自然数（0和正整数）的范围内，
4的约数有：1、2、4。
6的约数有：1、2、3、6。
10的约数有：1、2、5、10。
12的约数有：1、2、3、4、6、12。
15的约数有：1、3、5、15。
18的约数有：1、2、3、6、9、18。
20的约数有：1、2、4、5、10、20。
注意：一个数的约数包括1及其本身。
例如：能整除24的有：1、2、3、4、6、8、12、24。
所以
24的约数有：1、2、3、4、6、8、12、24。
相关信息
公因数如果一个数c既是数a的因数，又是数b的因数，那么c叫做a与b的公因数。可以表示为(a，b)=c。最大公因数两个数的公因数中最大的一个，叫做这两个数的最大公因数。最大公因数的求法1、 枚举法将两个数的因数分别一一列出，从中找出其公因数，再从公因数中找出最大的一个，即为这两个数的最大公因数。
例：求30与24的最大公因数。
30的因数有：1,2,3,5,6,10,15,30
24的因数有：1,2,3,4,6,8,12,24
易得其公因数中最大的一个是6，所以30和24的最大公因数是6。
2、 短除法短除符号就像一个倒过来的除号，短除法就是先写出要求最大公因数的两个数A、B，再画一个短除号，接着在原本写除数的位置写两个数公有的质因数Z（通常从最小的质数开始），然后在短除号的下方写出这两个数被Z整除的商a，b，对a，b重复以上步骤，以此类推，直到最后的商互质为止，再把所  求12和18的最大公约数有的除数相乘，其积即为A，B的最大公因数。  短除法（短除法同样适用于求最小公倍数，只需将其所有除数与最后所得的商相乘即可）
例：求12和18的最大公约数。
解：用短除法，由左图，易得12和18的最大公约数为2×3=6.。
3、分解质因数将需要求最大公因数的两个数A，B分别分解质因数，再从中找出A、B公有的质因数，把这些公有的质因数相乘，即得A、B的最大公约数。
例：求48和36的最大公因数。
把48和36分别分解质因数：
48=2×2×2×2×3
36=2×2×3×3
其中48和36公有的质因数有2、2、3，所以48和36的最大公因数是 2×2×3=12。
4、辗转相除法（欧几里得算法）对要求最大公因数的两个数a、b，设b<a，先用b除a，得a=bq……r1(0≤r1<b）。若r1=0，则（a，b)=b；若r1≠0，则再用r1除b，得b=r1q……r2 (0≤r2<r1）.，若r2=0，则（a，b)=r1，若r2≠0，则继续用r2除r1……如此循环，直到能整除为止。其最后一个非零余数即为（a，b）。
这一算法的证明如下：
设两数为a、b(b<a），用gcd(a,b）表示a，b的最大公约数，r=a mod b 为a除以b以后的余数，辗转相除法即是要证明gcd(a,b)=gcd(b,r）。
令c=gcd(a,b），则设a=mc，b=nc，根据前提有r =a-kb=mc-knc=(m-kn)c 
由上，可知c也是r的因数，故可以断定m-kn与n互素【否则，可设m-kn=xd，n=yd，（d>1），则m=kn+xd=kyd+xd=(ky+x)d，则a=mc=(ky+x)dc，b=nc=ycd，故a与b最大公因数成为cd，而非c】 
所以 gcd(b,r)=c，继而gcd(a,b)=gcd(b,r）。
例：求8251和6105的最大公因数。
考虑用较大数除以较小数，求得商和余数：
8251=6105×1+2146
6105=2146×2+1813
2146=1813×1+333
1813=333×5+148
333=148×2+37
148=37×4
最后除数37是148和37的最大公因数，也就是8251与6105的最大公因数。
因数
5、更相减损术 更相减损术出自《九章算术》的一种求最大公约数的算法，它原本是为约分而设计的，但它适用于任何需要求最大公约数的场合。其原文为：“可半者半之，不可半者，副置分母、子之数，以少减多，更相减损，求其等也。以等数约之。”
翻译成现代语言就是
第一步：任意给定两个正整数a、b；判断它们是否都是偶数。若是，则用2约简；若不是则执行第二步。
第二步：以较大的数减较小的数，接着把所得的差与较小的数比较，并以大数减小数。继续这个操作，直到所得的减数和差相等为止。这个数就是a、b的最大公约数。
例：求98与63的最大公因数。
分析：由于63不是偶数，把98和63以大数减小数，并辗转相减：
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以，98和63的最大公约数为7。
注：以上1、2、3同样适用于求多个自然数的最大公约数。
因数和约数的不同
约数和因数的区别有三点：1、数域不同。约数只能是自然数，而因数可以是任何数。
2、关系不同。约数是对两个自然数的整除关系而言，只要两个数是自然数，就能确定它们之间是否存在约数关系，如：40÷5=8，40能被5整除，5就是40的约数，12÷10=1.2，12不能被10整除，10不是12的约数。因数是两个或两个以上的数对它们的乘积关系而言的。如：8×2=16，8和2都是积16的因数，离开乘积算式就没有因数了。 　
3、大小关系不同.当数a是数b的约数时，a不能大于b，当a是b的因数时，a可以大于b，也可以小于b。一般情况下，约数等于因数。[1]
求约公式
一般地，对自然数n进行分解质因数，设n可以分解为
n=p⑴^α⑴·p⑵^α*⑵·…·p(k)^α（k)
其中p⑴、p⑵、…p(k）是不同的质数，α⑴、α⑵、…α（k）是正整数，则形如
n=p⑴^β⑴·p⑵^β*⑵·…·p(k)^β（k)
的数都是n的约数，其中β⑴可取a⑴+1个值：0,1,2，…，α⑴；β⑵可取α⑵+1个值：0,1,2，…，α⑵…；β（k）可取a(k)+1个值：0,1,2，…，α（k).且n的约数也都是上述形式，根据乘法原理，n的约数共有
（α⑴+1）（α⑵+1）…（α（k)+1） ⑺
个。
式⑺即为求一个数约数个数的公式。  约数个数求法公式
算法实现
（C语言）
/*求两数的最大公约数和最小公倍数*/
/*解法一：辗转相除法
令大数为m，小数为n，若其余数residue不为0，则m=n，n=其余数，继续直到余数为0
*/
submul(int m,int n)
{
int residue;
while(residue=m%n)
{
m=n;
n=residue;
}
return n;
}
/*解法二：穷举法
穷举出所有两个数的公约数
*/
submul(int m,int n)
{
int i,residue;
for(i=1;i<n;i++)
if(m%i==0&&n%i==0)residue=i;
return residue;
}
main()
{
int a,b,submultiple,multiple;
scanf("%d%d",&a,&b);
submultiple=a>b?submul(a,b):submul(b,a);
multiple=a*b/submultiple;
printf("%d %d\n",submultiple,multiple);
}
负约数
定义国内课本中，最先提到约数这个概念是在小学，而此时还没学负数。
等到学了负数，一般要直到大学数学系“初等数论”中才严格定义约数，那个时候就包括负约数了。
如果d|a并且d≥0，则我们说d是a的约数。注意，d|a当且仅当（-d)|a，因此定义约数为非负整数不会失去一般性，只要明白a的任何约数的相应负数同样能整除a。一个整数a的约数最小为1，最大为|a|。例题105的负约数的和是多少？
105的所有负约数就是105的所有正约数的相反数所组成的集合。
105的正约数有1,3,5,7,15,21,35,105
105的负约数有-1,-3,-5,-7,-15,-21,-35,-105
其和为 -（1+3+5+7+15+21+35+105） = ﹣192