对n个数求解最大公约数和最小公倍数 C语言

 

一:问题描述

求n个数的最大公约数和最小公倍数。

二:算法思路

  1. 先自定义一个函数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()函数里,得到了解决,上面在调用函数时也不是很顺利,因为数组变了,所以在这里也花了好多时间,通过同学的帮助,我对函数调用这里有了更多的掌握,但是通过这些问题,也让我看出来自己在那块不是很熟练,知识掌握得不是很好,通过解决这次程序的问题,也让我巩固了这方面的知识,在下一次编程不会在不知道怎么改正,虽然每次都会遇到好多问题,但是,解决好问题,我们就有很大的收获,相信自己的编程会越来越好,

 

 

 

 

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值