一:问题描述
求n个数的最大公约数和最小公倍数。
二:算法思路
- 先自定义一个函数gcd(),求两个数的最大公约数
int gcd(int a,int b)
{
int temp;
if(a<b)
{ temp=a;a=b;b=temp;}
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return (a);
}
2.自定义函数lcm(),求两个数的最小公倍数
int lcm(int a,int b)
{
int gcd (int a,int b);
int temp;
temp=gcd(a,b);
return (a*b/temp);
}
3定义函数ngcd().循环求解两个数的最大公约数,调用gcd(),c=gcd(c,v[i])将返回值与数组中下一个数比较。
4定义函数nlcm().循环求解两个数的最大公约数,调用lcm() ,c=lcm(c,v[i]);将返回值与数组中下一个数比较。
5利用for循环将数组的数一次次输入,for(int i=2;i<n;i++) ,从第三个数开始。
6If语句来判断只有一个数时的结果
if(n==1)
return v[0];
return gcd(v[n-1],ngcd(v,n-1));
}
7定义main()函数,
int n,i;
int v[100]; //定义一个数组
printf("请输入要求的个数:\n");
scanf("%d",&n);
printf("请输入n个数:",n);
for(i=0;i<n;i++) //循环输入
{
scanf("%d",&v[i]);
}
定义一个数组,循环输入自己想要求解的数值
8最后输出结果:
printf("输出最大公约数%d\n",ngcd(v,n));
printf("输出最小公倍数%d\n",nlcm(v,n)); //输出结果
程序代码:
#include <cstdio>
#include <iostream>
using namespace std;
#define MAX 100;
int gcd(int a,int b) /*自定义函数求两数的最大公约数*/
{
int temp; /*定义整型变量*/
if(a<b) /*通过比较求出两个数中的最大值和最小值*/
{ temp=a;a=b;b=temp;} /*设置中间变量进行两数交换*/
while(b!=0) /*通过循环求两数的余数,直到余数为0*/
{
temp=a%b;
a=b; /*变量数值交换*/
b=temp;
}
return (a); /*返回最大公约数到调用函数处*/
}
int lcm(int a,int b) /*自定义函数求两数的最小公倍数*/
{
int gcd (int a,int b); /*自定义函数返回值类型*/
int temp;
temp=gcd(a,b); /*再次调用自定义函数,求出最大公约数*/
return (a*b/temp); /*返回最小公倍数到主调函数处进行输出*/
}
int ngcd(int *v,int n) /*自定义函数求最大公约数*/
{
int a=v[0]; //定义变量a附数组第一个数值
printf("%d\n",v[0]); //打印第一个数
int b=v[1]; //定义变量b附数组第二个数值
int c=gcd(a,b); //定义c为a,b所求最大公约数返回值
printf("%d\n",c); //输出c
for(int i=2;i<n;i++) //for循环从第三个数开始
{
c=gcd(c,v[i]);//前两个值与数组下一个数比较,调用gcd()函数
printf("%d\n",c);//输出c
}
return (c);
if(n==1) //判断当只有一个数时,最大公约数,返回自身值
return v[0];
return gcd(v[n-1],ngcd(v,n-1));
}
int nlcm(int *v,int n) //自定义函数求两数的最小公倍数
{
int a=v[0]; //定义a,b并附数组前两个数值
int b=v[1];
int c=lcm(a,b); //定义c为a,b最小公倍数
for(int i=2;i<n;i++)//从第三个数开始循环比较
{
c=lcm(c,v[i]);
}
return c;
if(n==1) //判断当只有一个数时,最大公约数,返回自身值
return v[0];
return lcm(v[n-1],nlcm(v,n-1));
}
int main()
{
int n,i;
int v[100]; //定义一个数组
printf("请输入要求的个数:\n");
scanf("%d",&n);
printf("请输入n个数:",n);
for(i=0;i<n;i++) //循环输入
{
scanf("%d",&v[i]);
}
printf("%d\n",ngcd(v,n));
printf("%d\n",nlcm(v,n)); //输出结果
return 0;
}
测试截图:
心得体会:
这次程序设计作业,和上次上机内容相似,首先脑海中有一点思路,但是有些地方能想到,但是写出来会是错误,但还是感觉自己有所提升,在本次算法设计中。我用了辗转相除法来求两个数的最大公约数,和最小公倍数,然后定义一个数组,让两两比较,前两个比较后与数组中下一个数比较,直到最后一个结果。思路是这样,但是在编写程序时遇到了好多问题,在数组定义时,刚开始写的只能是在程序里给定数值,但后来我想要能自己控制输入的数值,所以想改动这个地方,但是自己写的时候老是出现错误,我写了好多个版本,都不是很成功,所以我请教了同学这里如何改,然后就用了循环输入,和设置每次输入个数在main()函数里,得到了解决,上面在调用函数时也不是很顺利,因为数组变了,所以在这里也花了好多时间,通过同学的帮助,我对函数调用这里有了更多的掌握,但是通过这些问题,也让我看出来自己在那块不是很熟练,知识掌握得不是很好,通过解决这次程序的问题,也让我巩固了这方面的知识,在下一次编程不会在不知道怎么改正,虽然每次都会遇到好多问题,但是,解决好问题,我们就有很大的收获,相信自己的编程会越来越好,