c语言有参有类最小公倍数,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

{ 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值