多种算法求最大公约数和最小公倍数

算法思路分析:求最大公约数的时候,在程序里面定义了五个函数,辗转相除法,辗转相减法,穷举法和menu函数,其中辗转相除法用了两种算法包含了函数嵌套。最后定义menu,用了switch语句,当用户选择要运算的方法时候,系统调用函数运算出结果。求最大公倍数的时候,从上面几个求最大公约数的方法里面选择一个,最小公倍数=输入的数据乘积/最大公约数。一种算法是两个两个的进行求最小公倍数,最后的结果就是多个数的最小公倍数。另一种算法是,求出多个数的乘积和最大公约数,求商即为最小公倍数。
求最大公约数
#include "stdafx.h"
#include<stdio.h>
int i=1;
void fun1(int a,int b)//辗转相除法1
{
	int temp;
	if(a<b)
	{
		temp=a;
		a=b;
		b=temp;
	}
	
	while(b!=0)
	{
		temp=a%b;
		a=b;
		b=temp;
	}
	printf("最大公约数为%d\n",a);
}

int fun2(int a,int b)//辗转相除法2 
{
	if(a%b==0)
	{
		return b;
	}
	else 
	{
		return fun2(b,a%b);
	}
	printf("最大公约数为%d\n",a);
	return 0;
}

void fun3(int a,int b)//穷举法 
{
	int temp = (a>b)?b:a;
	while(temp>0)
	{
		if(a%temp==0&&b%temp==0)
		{
			break;
		}
		temp--;
		
	}
	printf("最大公约数为%d\n",temp);
}

void fun4(int a,int b)//辗转相减法 
{
	while(a!=b)
	{
		if(a>b)
		{
			a=a-b;
		} 
		else
		{
			b=b-a;
		}
	}
	printf("最大公约数为%d\n",b);
}

void menu()/* 界面*/
{
	int a,b,num;
	printf("  ******************************************************\n\n");
	printf("  *                求取最大公约数                    *\n \n");
	printf("  ******************************************************\n\n"); 
	printf("*********************程序算法选择************************ \n");
	printf("     ----------------------   ----------------------   \n");
	printf("     *********************************************     \n");
	printf("     * 1.辗转相除法(1)  * *  2.辗转相除法(2)  *     \n");
	printf("     *********************************************     \n"); 
	printf("     * 3.辗转相减法       * *  4.穷举法           *     \n");
	printf("     *********************************************     \n");
	printf("     **********************  ************************** \n");
	printf("     ----------------------   ----------------------   \n");
	
	printf("请选择菜单编号:");
	scanf_s("%d",&num);

	printf("请输入两个整数:\n");
	scanf_s("%d%d",&a,&b);

	switch(num)
	{ 
	case 1:fun1(a,b);break;
	case 2:fun2(a,b);break;
	case 3:fun3(a,b);break;
	case 4:fun4(a,b);break;
	default:printf("请在1-4之间选择\n");
	}
	
}
int main()
{
	while(i)
	{
	menu();
	}
	return 0;
} 
求多组数的最大公倍数

公倍数1
#include "stdafx.h"
#include<stdio.h>
#define m 100
#define n 100
int fun4();
int fun5();
int fun4(int a,int b)//定义辗转相除法
{
	if(a%b==0)
	{
		return b;
	}
	else 
	{
		return fun4(b,a%b);
	}
 } 
int fun5(int a,int b)//定义计算公约数的函数
	{
	 	return (a*b/(fun4(a,b)));
	}
int main()
	{
		int d,e,g,h,data[m][n];
		int i,j;
		printf("请输入要录入数据的行数:\n");
		scanf_s("%d",&d);
  	for(i=0;i<d;i++)
	{
		printf("请输入第%d行要录入的数据总数:\n",i+1);
		scanf_s("%d",&e);
		printf("请输入要求最小公倍数的数据\n");
	for(j=0;j<e;j++)
	{
		scanf_s("%d",&data[i][j]);
	}
		g=data[i][0];//g等于每一行的第一个数
	for(j=1;j<e;j++)
	{
		g=fun5(g,data[i][j]);//两个两个求最小公倍数
	}
		printf("第%d行的最小公倍数为%d\n",i+1,g);
} 
} 


公倍数2
#include "stdafx.h"
#include<stdio.h>
#define m 100
#define n 100
int fun4();
int fun5();
int fun4(int a,int b)//定义辗转相除法
{
	if(a%b==0)
	{
		return b;
	}
	else 
	{
		return fun4(b,a%b);
	}
 } 
int fun5(int a,int b)//定义计算公约数的函数
	{
	 	return (a*b/(fun4(a,b)));
	}
int main()
	{
		int d,e,g,h,data[m][n];
		int i,j,p;
		printf("请输入要录入数据的行数:\n");
		scanf_s("%d",&d);
  	for(i=0;i<d;i++)
	{
		printf("请输入第%d行要录入的数据总数:\n",i+1);
		scanf_s("%d",&e);
		printf("请输入要求最小公倍数的数据\n");
	for(j=0;j<e;j++)
	{
		scanf_s("%d",&data[i][j]);
	}
		g=data[i][0];//g等于每一行的第一个数
	for(j=1;j<e;j++)
	{
		g=fun4(g,data[i][j]);//两个两个求最大公约数
		h=1;
	}
	for(j=0;j<e;j++)
	{
		//最小公倍数=所有输入数的积除以他们的最大公约数
		h=h*data[i][j];
		p=h/g;
	}
		printf("第%d行的最小公倍数为%d\n",i+1,p);
} 
} 

个人总结:在最初写辗转相除法的时候,每次只能输入一组数,感觉这样很浪费时间,于是我后来加了for循环,自己可以输入几组都可以,后来还用了函数嵌套使算法更加简化了。写完了几个算法之后,我用了menu函数将多个算法融合到一起,整个程序感觉更加精简了。在完成最小公倍数的时候,两个算法想了很久。在完成程序之后,我突然感觉算法真的好伟大!一个完美的算法真的可以让程序更加精简!以后还是要多加练习算法!
  



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值