算法思路分析:求最大公约数的时候,在程序里面定义了五个函数,辗转相除法,辗转相减法,穷举法和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函数将多个算法融合到一起,整个程序感觉更加精简了。在完成最小公倍数的时候,两个算法想了很久。在完成程序之后,我突然感觉算法真的好伟大!一个完美的算法真的可以让程序更加精简!以后还是要多加练习算法!