求最大公约数和最小公倍数

//日期:2017-3-18
//题目:用三种算法求两个整数的最大公约数,用两种算法求两个整数的最小公倍数
//语言:C语言
//作者:软工1508010205杨兰


#include<stdio.h>
//辗转相除法求最大公约数
int qy_gcd(int a,int b)
{
    int c;
	c=a%b;
	while( c!=0 )
    //用大数除以小数取余,直到余数为零
	{
		a=b;
		b=c;
		c=a%b;
	}
	return b;
}
//相减法求最大公约数
int ql_gcd(int a,int b)
{
	while( a!=b )
    //用大数减小数取差值,直到差值与减数相等
	{
		if ( a>b )
			a-=b;
		else
			b-=a;
	}
	return b;
}
//穷举法求最大公约数
int qz_gcd(int a,int b)
{
	int i;
	i=(a<b)?a:b;//取a,b中较小的数赋给i
	//当a,b不能同时整除i时,执行i--,否则结束,返回i值
	while(!(a%i==0 && b%i==0))
            {
			i--;
			}
			return i;
}
//循环除法求最小公倍数
int qa_lcm(int a,int b)
{
	int k;
    for(k=1;;k++)
	{      
        if(k%a==0 && k%b==0)//如果k不能同时整除a和b,则循环,否则跳出循环  
			break; 
	}
	return k;
}
//主函数	
void main()
{
	int x,y;
	printf("\n请输入两个整数(用逗号间隔):");
	scanf("%d,%d",&x,&y);
	printf("\n1.求最大公约数:\n\n");
	printf("  (辗转相除法)求最大公约数=%d\n\n",qy_gcd(x,y));
    printf("  (相减法)求最大公约数=%d\n\n",ql_gcd(x,y));
    printf("  (穷举法)求最大公约数=%d\n\n",qz_gcd(x,y));
    printf("2.求最小公倍数:\n\n");
    printf("  (循环除法)求最小公倍数=%d\n\n",qa_lcm(x,y));
    printf("  (利用最大公约数法)求最小公倍数=%d\n\n",x*y/qy_gcd(x,y));//利用最大公约数求最小公倍数法
}

//日期:2017-3-18
//题目:求n个数的最小公倍数
//语言:C语言
//作者:软工1508010205杨兰


#include<stdio.h>
int gcd(int m, int n)//最大公约数函数
{
    if(m%n == 0)
		return n;
    return gcd(n, m%n);
}
int lcm(int m, int n)//最小公倍数函数
{
	return m*n/gcd(m,n);//两数之积除以它们的最大公约数等于最小公倍数
}

int main()//主函数
{
	int n, i, *a, r=1;
    printf("\n请填写输入数据的个数:");
    scanf("%d",&n);	
    a=(int *) malloc (sizeof(int) * n);//申请动态数字空间
    printf(" \n请输入数据:");
//先求两个数的最小公倍数,然后用结果和第三个数求最小公倍数,依次类推,直到用前n-1个数的最小公倍数和第n个数求最小公倍数,即为最终结果
    for(i=0;i<n;i++)
		scanf("%d",a+i);
	for(i=0;i<n;i++)
    r=lcm(r,a[i]);//最终的最小公倍数
	printf(" \n最小公倍数为:r=%d\n ",r);
	free(a);//释放空间
	return 0;
}

一.运行截屏

1.求两个数的最大公约数和最小公倍数:
2.求n个数的最小公倍数:

二.测试用例

            Input

            2 5 8 10 3

            6 7 8

            Output

            r=120

            r=168

三.个人总结

    这次的作业是求最大公约数和最小公倍数,但是要用三种算法来写的话的确还要费点劲,最好想也最简单的当然属欧几里得算法(辗转相除法),其次我还用到了相减法和穷举法,起初觉得要用三种算法来做有点困难,但是现在我觉得,只要理解了算法,那么将其转换成代码就没有太大的问题,当然,说在编写程序时没有遇到困难是不可能的,一个良好的程序应该是在不断的修改当中完成的。

    在写完求两个数的最大公约数之后,我又用了两种算法进而求了两个数的最小公倍数,一种是循环除法(这是我给这种算法取得名字),写了相应的算法,另一种就是根据两数之积除以其最大公约数来求的,这种算法在程序中的主函数输出语句中体现了,写完程序后我运行了一下,开始会出现很多错误,有语法错误,更甚者会出现标点符号的错误,但这种错误很明显,只要看到就会立马改正过来,其中最难改的是逻辑错误,这种错误系统不会给你提示,只有在运行时才能发现,或许是功能欠缺,也或许是输出的值不是理想要得到的值,这时候就要带着问题返回到程序中修改相应代码了,在排除完所有错误并且也得到了期望的值,那么这个程序就算是基本完成了,另外,为了美观清晰起见,可以对程序添加必要的注释,以及文本注释等,也可以对运行界面做相应的调整,这样就算得上是一个良好的程序了吧。

    另外,我还写了一个针对n个数求最小公倍数的小程序,程序虽短但应有尽有,正所谓,麻雀虽小,但五脏俱全。

    这两个程序虽说不长,但也花费了我不少的时间,是我努力得来的结果,从中我也学到了不少东西,在不断发现问题解决问题中我收获了很多解决错误的方法,也明白了写程序是需要时间和耐心还有足够的知识储备的,由于目前我正在复习C语言,所以这两个程序我都是用C写的,从另一方面来讲,这次作业让我在复习C的过程中也得到了很好的实践,所以我想尽快将C复习完,然后再好好复习一下C++,以便在下次的作业或者上机时能够很好地应用到。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值