在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语言里的基础,只有掌握好基础,才能解决更深奥的问题 !
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-28 20:14:14