C语言求最大公约数和最小公倍数算法总结

时间:2024.5.8

C语言求最大公约数和最小公倍数算法总结

单位:隆回县职业中等专业学校 作者:刘小华

摘 要:介绍自己通过学习使用C语言求任意两个数的最大公约数和最小公倍数的基本算法思想、算法过程、代码实现以及分析比较。

关键词:C语言 算法 最大公约数 最小公倍数

中图分类号: TP312 文献标识码:A

The algorithm summarization of evaluating the highest common divisor and the lowest common multiple in C Language

Zhao Ye Lin Tutor Teacher:Liu Xiao Hua

Abstract:Introduction to the algorithm basic thought, algorithm process and code realization and its analysing comparison in terms of evaluating the highest common divisor and the lowest common multiple of any two positive integers by learning to using C Language

Keywords:C Language algorithm the highest common divisor the lowest common multiple

C语言求最大公约数和最小公倍数可以说是C语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容。其算法方面除常用的辗转相除法外、还可以根据数学定义法、递归调用法等。下面结合我学习以来的笔记整理、总结几种常用的方法进行比较,以便能够更好的理解、应用、共勉。

前提:假设求任意两个整数的最大公约数和最小公倍数,采用函数调用形式进行。

1、辗转相除法

辗转相除法(又名欧几里德法)C语言中用于计算两个正整数a,b的最大公约数和最小公倍数,实质它依赖于下面的定理:

a b=0

gcd(a,b) =

gcd(b,a mod b) b!=0

根据这一定理可以采用函数嵌套调用和递归调用形式进行求两个数的最大公约数和最小公倍数,现分别叙述如下:

①、函数嵌套调用

其算法过程为: 前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数

1、大数放a中、小数放b中;

2、求a/b的余数;

3、若temp=0则b为最大公约数;

4、如果temp!=0则把b的值给a、temp的值给a;

5、返回第第二步;

代码:

int divisor (int a,int b) /*自定义函数求两数的最大公约数*/

{

int temp; /*定义整型变量*/

if(a<b) /*通过比较求出两个数中的最大值和最小值*/

{ temp=a;a=b;b=temp;} /*设置中间变量进行两数交换*/

while(b!=0) /*通过循环求两数的余数,直到余数为0*/

{

temp=a%b;

a=b; /*变量数值交换*/

b=temp;

}

return (a); /*返回最大公约数到调用函数处*/

}

int multiple (int a,int b) /*自定义函数求两数的最小公倍数*/

{

int divisor (int a,int b); /*自定义函数返回值类型*/

int temp;

temp=divisor(a,b); /*再次调用自定义函数,求出最大公约数*/

return (a*b/temp); /*返回最小公倍数到主调函数处进行输出*/

}

#include "stdio.h" /*输入输出类头文件*/

main()

{

int m,n,t1,t2; /*定义整型变量*/

printf("please input two integer number:"); /*提示输入两个整数*/

scanf("%d%d",&m,&n); /*通过终端输入两个数*/

t1=divisor(m,n); /*自定义主调函数*/

t2=multiple(m,n); /*自定义主调函数*/

printf("The higest common divisor is %d\n",t1); /*输出最大公约数*/

printf("The lowest common multiple is %d\n", t2); /*输出最小公倍数*/

}

启示:请注意算法中变量数值之间的相互交换方法、如何取模、怎样进行自定义函数及主调函数与被调函数间的相互关系,函数参数的定义及对应关系特点,利用控制语句如何实现。

②、函数递归调用

int gcd (int a,int b)

{ if(a%b==0)

return b;

else

return gcd(b,a%b);

}

#include "stdio.h"

main()

{

int m,n,t1;

printf("please input two integer number:");

scanf("%d%d",&m,&n);

t1=gcd(m,n);

printf("The highest common divisor is %d\n",t1);/*最大公约数*/

printf("The least common multiple is %d\n",m*n/t1);/*最小公倍数*/

getch();

}

启示:采用递归调用法要注意递归终止条件的描述,只有找到递归变化的规律,才能有效地解决问题。

2、穷举法(利用数学定义)

穷举法(也叫枚举法)穷举法求两个正整数的最大公约数的解题步骤:从两个数中较小数开始由大到小列举,直到找到公约数立即中断列举,得到的公约数便是最大公约数 。

①、定义1:对两个正整数a,b如果能在区间[a,0]或[b,0]内能找到一个整数temp能同时被a和b所整除,则temp即为最大公约数。

代码为:

int divisor (int a,int b) /*自定义函数求两数的最大公约数*/

{

int temp; /*定义义整型变量*/

temp=(a>b)?b:a; /*采种条件运算表达式求出两个数中的最小值*/

while(temp>0)

{

if (a%temp==0&&b%temp==0) /*只要找到一个数能同时被a,b所整除,则中止循环*/ break;

temp--; /*如不满足if条件则变量自减,直到能被a,b所整除*/

}

return (temp); /*返回满足条件的数到主调函数处*/

}

#include "stdio.h"

main()

{

int m,n,t1;

printf("please input two integer number:");

scanf("%d%d",&m,&n);

t1=divisor(m,n);

printf("The higest common divisor is %d\n",t1);

getch();

}

②、定义2:对两个正整数a,b,如果若干个a之和或b之和能被b所整除或能被a所整除,则该和数即为所求的最小公倍数。

代码为:

int multiple (int a,int b)

{

int p,q,temp;

p=(a>b)?a:b; /*求两个数中的最大值*/

q=(a>b)?b:a; /*求两个数中的最小值*/

temp=p; /*最大值赋给p为变量自增作准备*/

while(1) /*利用循环语句来求满足条件的数值*/

{

if(p%q==0)

break; /*只要找到变量的和数能被a或b所整除,则中止循环*/

p+=temp; /*如果条件不满足则变量自身相加*/

}

return (p);

}

#include "stdio.h"

main()

{

int m,n,t2;

printf("please input two integer number:");

scanf("%d%d",&m,&n);

t2=multiple(m,n);

printf("The least common multiple is %d\n",t2);

getch();

}

启示:根据数学定义求任意两个正整数的最大公约数和最小公倍数,相对辗转相除法来说,易懂,容易被学习者接受,但也请读者注意强制退出循环过程的条件、变量的特点及控制语句的使用。

结束语

C语言编程关键在于确定好算法及算法过程,同时要合理定义变量和函数及控制语句操作,只有这样才能保证编程的正确性、、可读性、实用性。

参考文献

[1] C程序设计 第二版 谭浩强 清华大学出版社 20xx

[2] 常用算法程序集(C语言描述)第三版 徐士良 清华大学出版社 20xx

[3] 数据结构(C语言版)严蔚敏 吴伟民 清华大学出版社 20xx

[4] 算法与程序设计 南志红 中国物资出版社 20xx年


第二篇:C语言求最大公约数和最小公倍数算法


C语言求最大公约数和最小公倍数算法

C语言求最大公约数和最小公倍数可以说是C语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容。其算法方面除常用的辗转相除法外、还可以根据数学定义法、递归调用法等。下面结合我学习以来的笔记整理、总结几种常用的方法进行比较,以便能够更好的理解、应用、共勉。

前提:假设求任意两个整数的最大公约数和最小公倍数,采用函数调用形式进行。

1、辗转相除法

辗转相除法(又名欧几里德法)C语言中用于计算两个正整数a,b的最大公约数和最小公倍数,实质它依赖于下面的定理:

a b=0

gcd(a,b) =

gcd(b,a mod b) b!=0

根据这一定理可以采用函数嵌套调用和递归调用形式进行求两个数的最大公约数和最小公倍数,现分别叙述如下:

①、函数嵌套调用

其算法过程为: 前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数

1、大数放a中、小数放b中;

2、求a/b的余数;

3、若temp=0则b为最大公约数;

4、如果temp!=0则把b的值给a、temp的值给a;

5、返回第第二步;

代码:

int divisor (int a,int b) /*自定义函数求两数的最大公约数*/

{

int temp; /*定义整型变量*/

if(a<b) /*通过比较求出两个数中的最大值和最小值*/

{ temp=a;a=b;b=temp;} /*设置中间变量进行两数交换*/

while(b!=0) /*通过循环求两数的余数,直到余数为0*/

{

temp=a%b;

a=b; /*变量数值交换*/

b=temp;

}

return (a); /*返回最大公约数到调用函数处*/

}

int multiple (int a,int b) /*自定义函数求两数的最小公倍数*/

{

int divisor (int a,int b); /*自定义函数返回值类型*/

int temp;

temp=divisor(a,b); /*再次调用自定义函数,求出最大公约数*/

return (a*b/temp); /*返回最小公倍数到主调函数处进行输出*/

}

#include "stdio.h" /*输入输出类头文件*/

main()

{

int m,n,t1,t2; /*定义整型变量*/

printf("please input two integer number:"); /*提示输入两个整数*/

scanf("%d%d",&m,&n); /*通过终端输入两个数*/

t1=divisor(m,n); /*自定义主调函数*/

t2=multiple(m,n); /*自定义主调函数*/

printf("The higest common divisor is %d\n",t1); /*输出最大公约数*/

printf("The lowest common multiple is %d\n", t2); /*输出最小公倍数*/

}

启示:请注意算法中变量数值之间的相互交换方法、如何取模、怎样进行自定义函数及主调函数与被调函数间的相互关系,函数参数的定义及对应关系特点,利用控制语句如何实现。

②、函数递归调用

int gcd (int a,int b)

{ if(a%b==0)

return b;

else

return gcd(b,a%b);

}

#include "stdio.h"

main()

{

int m,n,t1;

printf("please input two integer number:");

scanf("%d%d",&m,&n);

t1=gcd(m,n);

printf("The highest common divisor is %d\n",t1);/*最大公约数*/

printf("The least common multiple is %d\n",m*n/t1);/*最小公倍数*/

getch();

}

启示:采用递归调用法要注意递归终止条件的描述,只有找到递归变化的规律,才能有效地解决问题。

2、穷举法(利用数学定义)

穷举法(也叫枚举法)穷举法求两个正整数的最大公约数的解题步骤:从两个数中较小数开始由大到小列举,直到找到公约数立即中断列举,得到的公约数便是最大公约数 。

①、定义1:对两个正整数a,b如果能在区间[a,0]或[b,0]内能找到一个整数temp能同时被a和b所整除,则temp即为最大公约数。

代码为:

int divisor (int a,int b) /*自定义函数求两数的最大公约数*/

{

int temp; /*定义义整型变量*/

temp=(a>b)?b:a; /*采种条件运算表达式求出两个数中的最小值*/

while(temp>0)

{

if (a%temp==0&&b%temp==0) /*只要找到一个数能同时被a,b所整除,则中止循环*/ break;

temp--; /*如不满足if条件则变量自减,直到能被a,b所整除*/

}

return (temp); /*返回满足条件的数到主调函数处*/

}

#include "stdio.h"

main()

{

int m,n,t1;

printf("please input two integer number:");

scanf("%d%d",&m,&n);

t1=divisor(m,n);

printf("The higest common divisor is %d\n",t1);

getch();

}

②、定义2:对两个正整数a,b,如果若干个a之和或b之和能被b所整除或能被a所整除,则该和数即为所求的最小公倍数。

代码为:

int multiple (int a,int b)

{

int p,q,temp;

p=(a>b)?a:b; /*求两个数中的最大值*/

q=(a>b)?b:a; /*求两个数中的最小值*/

temp=p; /*最大值赋给p为变量自增作准备*/

while(1) /*利用循环语句来求满足条件的数值*/

{

if(p%q==0)

break; /*只要找到变量的和数能被a或b所整除,则中止循环*/

p+=temp; /*如果条件不满足则变量自身相加*/

}

return (p);

}

#include "stdio.h"

main()

{

int m,n,t2;

printf("please input two integer number:");

scanf("%d%d",&m,&n);

t2=multiple(m,n);

printf("The least common multiple is %d\n",t2);

getch();

}

启示:根据数学定义求任意两个正整数的最大公约数和最小公倍数,相对辗转相除法来说,易懂,容易被学习者接受,但也请读者注意强制退出循环过程的条件、变量的特点及控制语句的使用。

结束语

C语言编程关键在于确定好算法及算法过程,同时要合理定义变量和函数及控制语句操作,只有这样才能保证编程的正确性、、可读性、实用性。

更多相关推荐:
C语言算法总结

1.水仙花数:#includestdio.hintmain(){inta,b,c,d;for(a=100;a=999;a++)/*thedataavarifyfrom100to999*/{b=a/100;c=a…

C语言算法总结,非常精辟

C语言算法总结2牛顿迭代求a的平方根思想汇总迭代公式为xn105xnaxn要求前后两次求出的x的差的绝对值小于105算法语句floatax0x1scanffampax0a2dox0x1x1x0ax02循环N次当...

C语言算法全总结

算法Algorithm计算机解题的基本思想方法和步骤算法的描述是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述包括需要什么数据输入什么数据输出什么结果采用什么结构使用什么语句以及如何安排这些语句等通常...

c语言常用算法总结

C语言常用算法模块的总结一最大值最小值问题教材page1316page362423page98例5152二连乘连加问题page113114115page12963page1296465三闰年算法page17pa...

c语言 算法之总结

算法Algorithm是一系列解决问题的清晰指令也就是说能够对一定规范的输入在有限时间内获得所要求的输出如果一个算法有缺陷或不适合于某个问题执行这个算法将不会解决这个问题不同的算法可能用不同的时间空间或效率来完...

c语言排序算法总结(主要是代码实现)

冒泡排序(BubbleSort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。…

C语言常用算法总结

C语言常用算法模块的总结一、最大值,最小值问题教材page13/1.6、page36/2.4(2)、(3)、page98例5.1、5.2二、连乘连加问题page113、114、115page129/6.3pag…

国二c语言公共基础知识总结

第一章数据结构与算法11算法算法是指解题方案的准确而完整的描述算法不等于程序也不等计算机方法程序的编制不可能优于算法的设计算法的基本特征是一组严谨地定义运算顺序的规则每一个规则都是有效的是明确的此顺序将在有限的...

C语言排序方法总结

C语言排序方法学的排序算法有插入排序合并排序冒泡排序选择排序希尔排序堆排序快速排序计数排序基数排序桶排序没有实现比较一下学习后的心得我不是很清楚他们的时间复杂度也真的不知道他们到底谁快谁慢因为书上的推导我确实只...

C语言常用算法总结(20xx.12)

C语言常用算法归纳编程题考查学生对一种C语言常用算法的设计能力以下对二级C语言考试中常用算法进行分类解析1计数求和求阶乘等算法这类问题使用循环实现需注意根据问题确定循环变量的初值终值及结束条件以及用于表示计数和...

c语言排序算法总结

一希尔Shell排序法Shell排序法includeltstdiohgtvoidsortintvintnintgapijtempforgapn2gapgt0gap2设置排序的步长步长gap每次减半直到减到1fo...

c语言学习总结

c语言学习总结1、c语言特点优点:(1)、c语言简洁、紧凑、灵活。书写格式自由。(2)、表达方式简练、实用。(3)、具有丰富的数据类型。(4)、具有低级语言的特点。(5)、c语言是一种结构化语言。(6)、各种版…

c语言算法总结(25篇)