您的位置:首页 > 其它

Num 19: 最大公约数.最小公倍数.素数的判断

2015-08-05 17:27 330 查看
在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>


二、素数的判断:

[b] 方法一:[/b]

逐个判断,从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>


[b][b] 方法二:[/b][/b]

[b][b] 素数打表判断;[/b][/b]

[b][b] 建立一个数组(数组内只有0,1)[ 1表示合数,0表示质数 ];[/b][/b]

[b][b] 从2开始,向后,所有2的倍数一定都是合数,标记为1;[/b][/b]

[b][b] 再从3开始,重复过程;若有些已经标记为合数,则跳过;[/b][/b]

[b][b]实现代码:[/b][/b]

<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
) printf("YES\n");
else printf("NO\n");
}
return 0;
}</span>


[b][b] 以上都是C语言里的基础,只有掌握好基础,才能解决更深奥的问题 !

[/b][/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: