一.源代码
1.三种以上算法解决两个正整数最大公约数问题。
#include<stdlib.h>
void help();
void menu();
void xiangjian();
void xiangchu();
void qiongju();
int q=1;
int main()
{
while(q)
{
menu();
}
system("pause");
return 0;
}
void help()
{
printf("欢迎使用最小公倍数计算系统\n");
printf("用0--4选择所要执行的操作\n");
printf("在输入的两个数字之间用逗号隔开\n");
printf("谢谢您的使用\n");
}
void xiangjian()//相减法求最大公约数
{
int a,b;
printf("请输入两个整数 :");
scanf("%d,%d",&a,&b);
while(a!=b)//a不等b
if(a>b)
{
a=a-b;
}
else
{
b=b-a;
}
printf("最大公约数:%d\n",a);
}
void qiongju() //穷举法求最大公约数
{
int m,n,a,b,y;
printf("输入两个数字:\n");
scanf("%d,%d",&a,&b);
m=a;
n=b;
for (y=a;y>0;y--)
if (a%y==0&&b%y==0)break;
printf("最大公约数是:%d\n",y);
}
void xiangchu()//相除法求最大公约数
{
int a,b,c,x,y;
printf("请输入两个数字:\n");
scanf("%d,%d",&a,&b);
x=a;
y=b;
while(b!=0) //一直除到余数等于0停止循环
{
c=a%b;
a=b;
b=c;
}
printf("最大公约数是:%d\n",a);
}
void menu()//界面菜单
{
int num;
printf(" @@@@@@@@@@@@@@@@@@@@@@@@ \n");
printf(" 三种算法求最大公约数 \n");
printf(" ********************** \n");
printf(" ***** 菜单 *****\n");
printf(" * 0.系统帮助及说明 *\n");
printf(" * 1.辗转相减法 *\n");
printf(" * 2.穷举法 *\n");
printf(" * 3.辗转相除法 *\n");
printf(" * 4.退出系统 *\n");
printf(" @@@@@@@@@@@@@@@@@@@@@@@@ \n");
printf("请选择菜单编号:");
scanf("%d",&num);
switch(num)
{
case 0:help();break;
case 1:xiangjian();break;
case 2:qiongju();break;
case 3:xiangchu();break;
case 4:q=0;break;
default:printf("请在0-4之间选择\n");
}
}
2.程序流程图:辗转相除法
![这里写图片描述](https://img-blog.csdn.net/20180906193112946?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg5NTQ0Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
3测试过程:测试用例
Input: 5 15
Output:5
![这里写图片描述](https://img-blog.csdn.net/2018090619335724?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg5NTQ0Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
二、 求3个正整数最小公倍数。
源代码:
#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.1算法思路:在上述方法3的基础上进行两两之间求最大公约数。
1.2算法思路:先分别循环输出三个数的倍数,再找出这三个数组中相同的数,将这些数放在一个新的数组中,使用sort()排序后进行输出
先设置一个number=1,然后while
True进行循环,判断number对abc取余,当它们的余数同时为0的时候break然后打印出number的数值,否则number+=1.
2.程序流程图:
3.测试结果:
测试用例(程序设计的是求n个数字的最小公倍数)
Input:1 2 3 4 5
Output:60
三、个人总结
这次的作业是求最大公约数和最小公倍数,但是要用三种算法来写的话的确还要费点劲,最好想也最简单的当然属欧几里得算法(辗转相除法)了,其次我还用到了相减法和穷举法,起初觉得要用三种算法来做有点困难,但是现在我觉得,只要理解了算法,那么将其转换成代码就没有太大的问题,当然,说在编写程序时没有遇到困难是不可能的,一个良好的程序应该是在不断的修改当中完成的。