在c语言的学习之中,经常会碰到:
计算最大公约数,最小公倍数和素数判断的问题;
在这里由浅入深总结一下:
1. 最大公约数与最小公倍数 :
由数学知识我们知道:
两个数的最小公倍数 = 这两个数的乘积 / 两个数的最大公约数;
所以求最大公约数和最小公倍数的问题其实是一类问题;
①.最小公倍数:
方法一:
若 x>y ,从 x开始,判断x能否被y整除(x%y==0);
若能够整除,x既为最小公倍数;
若不能整除,计算2x,3x,……nx能否被整除;
实现代码:
<span style="font-size:14px;">#include<stdio.h>
#include<math.h>
#include<string.h>
int lcm(int x,int y)
{
int temp;
if(y>x){temp=x;x=y;y=temp;}
temp=x;
while(x%y!=0) x+=temp;
return x;
}
int main()
{
int a,b,num;
while(scanf("%d%d",&a,&b)!=EOF)
{
printf("%d\n",(lcm(a,b)));
}
return 0;
}</span>
方法二:
通过计算最大公约数来间接求算最小公倍数:
<span style="font-size:14px;">#include<stdio.h>
#include<math.h>
#include<string.h>
int gcd(int x,int y)
{
int num=0;
num=(x>y?y:x);
while((x%num!=0||y%num!=0)&&num!=1) num--;
return num;
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
printf("%d\n",(a*b)/gcd(a,b));
}
return 0;
}</span>
②.最大公约数:
方法一:
(x<y)n从x开始判断x,y是否同时被n整除;
若能x为最大公约数,否则判断n--;
见最小公倍数代码;
方法二:
通过递归的方式模拟欧几里得算法:
即: x与x%y(不为零)的最大公约数相同;
实现代码:
<span style="font-size:14px;">#include<stdio.h>
#include<math.h>
#include<string.h>
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);//无需判断a,b大小,已自动判断;
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
printf("%d\n",(gcd(a,b)));
}
return 0;
}</span>
二、素数的判断:
方法一:
逐个判断,从2到sqrt(x)逐个判断,x能否被整除;
若能,为合数;否则,为质数;
实现代码:
<span style="font-size:14px;">#include<stdio.h>
#include<math.h>
int sushu(int x)
{
for(int i=2; i<=sqrt(x); i++)
if(x%i==0) return 0;
return 1;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
if(sushu(n)) printf("YES\n");
else printf("NO\n");
return 0;
}</span>
方法二:
素数打表判断;
建立一个数组(数组内只有0,1)[ 1表示合数,0表示质数 ];
从2开始,向后,所有2的倍数一定都是合数,标记为1;
再从3开始,重复过程;若有些已经标记为合数,则跳过;
实现代码:
<span style="font-size:14px;">#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
int sushu[2000001];
void sheet()
{
sushu[1]=0;sushu[2]=0;
for(int i=2;i<=2000000;i++)
if(!sushu[i])
for(int j=i+i;j<=2000000;j+=i)
sushu[j]=1;
}
int main()
{
int n;
memset(sushu,0,sizeof(sushu));
sheet();
while(scanf("%d",&n),n)
{
if(!sushu[n]) printf("YES\n");
else printf("NO\n");
}
return 0;
}</span>
以上都是C语言里的基础,只有掌握好基础,才能解决更深奥的问题 !