C语言 求最大公约数的三种方法,利用最大公约数求最小公倍数,通过分解质因数法来验证
2017-10-07 17:10
423 查看
这里列出三种求最大公约数的方法,用公式法就最小公倍数。
以及通过分解质因数法,来验证结果。分解质因数法我没有写出来。
质因数分解法:
最大公约数:
把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。
例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24、60)=12。
最小公倍数:
把几个数先分别分解质因数,再把各数中的全部 公有的质因数 和 独有的质因数 提取出来连乘,
所得的积就是这几个数的最小公倍数。
例如:求6和15的最小公倍数。先分解质因数,得6=2×3,15=3×5,6和15的全部公有的质因数是3,6独有质因数是2,15独有的质因数是5,2×3×5=30,30里面包含6的全部质因数2和3,还包含了15的全部质因数3和5,且30是6和15的公倍数中最小的一个,所以[6,15]=30。
测试:
以及通过分解质因数法,来验证结果。分解质因数法我没有写出来。
质因数分解法:
最大公约数:
把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。
例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24、60)=12。
最小公倍数:
把几个数先分别分解质因数,再把各数中的全部 公有的质因数 和 独有的质因数 提取出来连乘,
所得的积就是这几个数的最小公倍数。
例如:求6和15的最小公倍数。先分解质因数,得6=2×3,15=3×5,6和15的全部公有的质因数是3,6独有质因数是2,15独有的质因数是5,2×3×5=30,30里面包含6的全部质因数2和3,还包含了15的全部质因数3和5,且30是6和15的公倍数中最小的一个,所以[6,15]=30。
/** 求最大公约数的三种方法,穷举法,相减法,辗转相除法 公式法求最小公倍数:a*b/gcd(a,b) */ #include <stdio.h> int GCD(int,int); static int GCD1(int n1,int n2); static int GCD2(int a,int b); int main() { int n1, n2; int isEnd=1; while(isEnd==1) { isEnd='n'; printf("输出两个数(以空格分割):"); scanf("%d %d",&n1,&n2); printf("%d和%d的最大公约数为%d\n",n1,n2,GCD(n1,n2)); printf("%d和%d的最大公约数为%d\n",n1,n2,GCD1(n1,n2)); //辗转相除法:使用递归 printf("%d和%d的最大公约数为%d\n",n1,n2,GCD2(n1,n2)); printf("%d和%d的 最小公倍数为%d\n",n1,n2,n1*n2/GCD2(n1,n2)); //辗转相除法: 非递归 printf("%d和%d的最大公约数为%d\n",n1,n2,GCD22(n1,n2)); printf("%d和%d的 最小公倍数为%d\n",n1,n2,n1*n2/GCD22(n1,n2)); //通过分解质因数验证: printPrimeFactor(n1); printPrimeFactor(n2); printf("继续[1/0]?:"); scanf("%d",&isEnd); } printf("程序结束!\n"); return 0; } //求最大公约数:穷举法 /* 穷举法1: 有两整数a和b: ① i=1 ② 若a,b能同时被i整除,则gcd=i ③ i++ ④ 若 i <= a(或b),则再回去执行② ⑤ 若 i > a(或b),则t即为最大公约数,结束 */ int GCD(int n1,int n2) { int i; int gcd=0; for(i=1; i <= n1 && i <= n2; ++i) { // 判断 i 是否为最大公约数 if(n1%i==0 && n2%i==0)//如果能n1,n2同时除尽这个数 gcd = i;//那么这个数就是n1,n2的公约数,一遍循环之后就得到最大的公约数 } return gcd; } /* 相减法: 有两整数a和b: ① 若a>b,则a=a-b ② 若a<b,则b=b-a ③ 若a=b,则a(或b)即为两数的最大公约数 ④ 若a≠b,则再回去执行① 例如求27和15的最大公约数过程为: 27-15=12 ( 15>12 ) 15-12=3( 12>3 ) 12-3=9 ( 9>3 ) 9-3=6( 6>3 ) 6-3=3 ( 3==3 ) 因此,3即为最大公约数 */ static int GCD1(int n1,int n2) { /* 相减法: 有两整数a和b: ① 若a>b,则a=a-b ② 若a<b,则b=b-a ③ 若a=b,则a(或b)即为两数的最大公约数 ④ 若a≠b,则再回去执行① */ //④ 若a≠b,则再回去执行① while(n1!=n2) { if(n1 > n2)//① 若a>b,则a=a-b n1 -= n2; else n2 -= n1;//② 若a<b,则b=b-a } return n1;//若a=b,则a(或b)即为两数的最大公约数 } /* 辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b=c,再回去执行① 例如求27和15的最大公约数过程为: 27÷15 余1215÷12余312÷3余0因此,3即为最大公约数 */ //辗转相除法:使用递归 static int GCD2(int a,int b) { int c=0; c=a%b;//① a%b得余数c if(c==0) return b;//② 若c=0,则b即为两数的最大公约数 else { // ③ 若c≠0,则a=b,b=c,再回去执行① a=b; b=c; GCD(a,b); } } /* 辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b=c,再回去执行① 例如求27和15的最大公约数过程为: 27÷15 余1215÷12余312÷3余0因此,3即为最大公约数 */ //辗转相除法,非递归 int GCD22(int a, int b) { int c; if(a<b) // 取a,b中较大的一个数,a中存放较大的数,b中存放较小的数 { // 不通过引入中间变量,通过异或运算来交换两个数的值 a = a^b; b = a^b; a = a^b; }//保证a大于b c = a % b; //① a%b得余数c while(c)//② 若c=0,则b即为两数的最大公约数 { //③ 若c≠0,则a=b,b=c,再回去执行① a = b; b = c; c = a % b; //① a%b得余数c } return b; //② 若c=0,则b即为两数的最大公约数 } //分解质因数: void printPrimeFactor(int n)//对数n分解质因数 { printf("分解质因数:%d=",n); int factor=2;//最小的质因数为2 int flag=0; while (factor <= n)//合数大于等于因数 { if (n % factor == 0)//刚开始是除以2这个质数,一直除到到没有2的质数因数为止 { n = n / factor;//除以这个质数 if(flag==0)//if/else语句只是为了不输出第一个乘号“*” flag=1; else printf("*");//输出乘号 printf("%d",factor);//输出质因数 } else { factor++;//质因数加一, } } printf("\n"); }
测试:
输出两个数(以空格分割):12 68 12和68的最大公约数为4 12和68的最大公约数为4 12和68的最大公约数为4 12和68的 最小公倍数为204 12和68的最大公约数为4 12和68的 最小公倍数为204 分解质因数:12=2*2*3 分解质因数:68=2*2*17 继续[1/0]?:1 输出两个数(以空格分割):4 8 4和8的最大公约数为4 4和8的最大公约数为4 4和8的最大公约数为4 4和8的 最小公倍数为8 4和8的最大公约数为4 4和8的 最小公倍数为8 分解质因数:4=2*2 分解质因数:8=2*2*2 继续[1/0]?:1 输出两个数(以空格分割):23 14 23和14的最大公约数为1 23和14的最大公约数为1 23和14的最大公约数为1 23和14的 最小公倍数为322 23和14的最大公约数为1 23和14的 最小公倍数为322 分解质因数:23=23 分解质因数:14=2*7 继续[1/0]?:0 程序结束!
相关文章推荐
- javascript 求一组数的最小公倍数和最大公约数的简便算法 (三种方法,面向对象,回归迭代,和循环)
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- C语言求最小公倍数和最大公约数三种算法(经典)----ACM
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 利用三种方法求两个整数的最大公约数
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- C语言:三种基础方法求2个数的最大公约数。
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法