您的位置:首页 > 其它

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

2017-03-20 21:59 274 查看
//日期: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++,以便在下次的作业或者上机时能够很好地应用到。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: