Num 19: 最大公约数.最小公倍数.素数的判断
2015-08-05 17:27
330 查看
在c语言的学习之中,经常会碰到:
计算最大公约数,最小公倍数和素数判断的问题;
在这里由浅入深总结一下:
1. 最大公约数与最小公倍数 :
由数学知识我们知道:
两个数的最小公倍数 = 这两个数的乘积 / 两个数的最大公约数;
所以求最大公约数和最小公倍数的问题其实是一类问题;
①.最小公倍数:
方法一:
若 x>y ,从 x开始,判断x能否被y整除(x%y==0);
若能够整除,x既为最小公倍数;
若不能整除,计算2x,3x,……nx能否被整除;
实现代码:
方法二:
通过计算最大公约数来间接求算最小公倍数:
②.最大公约数:
方法一:
(x<y)n从x开始判断x,y是否同时被n整除;
若能x为最大公约数,否则判断n--;
见最小公倍数代码;
方法二:
通过递归的方式模拟欧几里得算法:
即: x与x%y(不为零)的最大公约数相同;
实现代码:
二、素数的判断:
[b] 方法一:[/b]
逐个判断,从2到sqrt(x)逐个判断,x能否被整除;
若能,为合数;否则,为质数;
实现代码:
[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]
[b][b] 以上都是C语言里的基础,只有掌握好基础,才能解决更深奥的问题 !
[/b][/b]
计算最大公约数,最小公倍数和素数判断的问题;
在这里由浅入深总结一下:
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]
相关文章推荐
- dedecms后台管理员密码重置和修改
- python多线程编程(7):线程间通信
- linux环境下,只复制文件夹目录及其子目录,不复制文件夹下面的文件,附:windows下的情况
- struts2使用注解--ACTION中的应用
- 如何建立简单的DAVE APP
- 喷水装置(一)
- 结构体基本操作
- ViewPager 详解(五)-----使用Fragment实现ViewPager滑动
- ViewPager 详解(四)----自主实现滑动指示条
- hdoj.1289 Hat’s IEEE【水题】 2015/08/05
- java静态代理和动态代理(JDK&cglib)
- android studio 下载及配置 Genymotion模拟器
- STL之set集合容器
- Emmet:HTML/CSS代码快速编写神器
- CUDA程序设计(二)
- Android 机顶盒应用开发经验(1)
- 使用Git命令从Github远程仓库更新项目
- Exercise——CopyComplexList
- select、poll、epoll之间的区别总结[整理]
- 编码方式获取Spring中PropertyPlaceholderConfigurer的属性