leecode-C语言实现-1979. 找出数组的最大公约数

一、leecode题目

给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数 。
两个数的 最大公约数 是能够被两个数整除的最大正整数。

示例 1:

输入:nums = [2,5,6,9,10]
输出:2
解释:
nums 中最小的数是 2
nums 中最大的数是 10
2 和 10 的最大公约数是 2

示例 2:

输入:nums = [7,5,6,8,3]
输出:1
解释:
nums 中最小的数是 3
nums 中最大的数是 8
3 和 8 的最大公约数是 1

示例 3:

输入:nums = [3,3]
输出:3
解释:
nums 中最小的数是 3
nums 中最大的数是 3
3 和 3 的最大公约数是 3

提示:
2 <= nums.length <= 1000
1 <= nums[i] <= 1000

二、解题思路

根据题意可以划分出两个功能:

(1)找出最大值、最小值

这里不拆成两个函数分别去求最大值和最小值,是因为这样实现的话,需要遍历两边数组,所以集成到一个函数中,遍历一次,得出最小值、最大值再放到一个长度为2的数组中。

(2)用递归的形式实现算出最大公约数

假设最大值和最小值分别是40,30,最大公约数计算方法如下:
40 / 30 = 1 … 10
30 / 10 = 3 … 0

10为最大公约数。
递归函数书写时需要思考两个问题:
1、出口
当余处为0时,除数为最大公约数,循环结束。

2、关系
除数和余数为下一个表达式的被除数和除数。

三、虚机模拟测试代码

#include <stdio.h>
#define SIZE 2

void main()
{
    int findGCD(int* nums, int numsSize);
    //int test_array[SIZE] = {2,5,6,9,10};
    //int test_array[SIZE] = {7,5,6,8,3};
    int test_array[SIZE] = {3,3};
    int i,result;
    
    for(i=0;i<SIZE;i++)
    {
        printf("%d ",test_array[i]);
    }
    printf("\n");

    result = findGCD(test_array, SIZE);
    printf("common divisor : %d\n",result);
}

int findGCD(int* nums, int numsSize)
{
    void FindMaxMin(int* nums, int numsSize , int* array);
    int SearchGcd(int num1 , int num2);
    int array[2];

    FindMaxMin(nums,numsSize,array);
    printf("min : %d\n",array[0]);
    printf("max : %d\n",array[1]);

    return SearchGcd(array[0] , array[1]);
}

void FindMaxMin(int* nums, int numsSize , int* array)
{
    int i;
    for(i=0;i<2;i++)
    {
        array[i] = nums[0];
    }

    for(i=0;i<numsSize;i++)
    {
        if(array[0] > nums[i])
        {
            array[0] = nums[i];
        }
        if(array[1] < nums[i])
        {
            array[1] = nums[i];
        }
    }
}

int SearchGcd(int num1 , int num2)
{
    int tmp = num2 % num1;
    if(tmp == 0)
    {
        return num1;
    }
    else
    {
        return SearchGcd(tmp , num1);
    }
}

四、虚机模拟测试截图

在这里插入图片描述

五、leecode提交源码

int findGCD(int* nums, int numsSize)
{
    void FindMaxMin(int* nums, int numsSize , int* array);
    int SearchGcd(int num1 , int num2);
    int array[2];

    FindMaxMin(nums,numsSize,array);
    //printf("min : %d\n",array[0]);
    //printf("max : %d\n",array[1]);

    return SearchGcd(array[0] , array[1]);
}

void FindMaxMin(int* nums, int numsSize , int* array)
{
    int i;
    for(i=0;i<2;i++)
    {
        array[i] = nums[0];
    }

    for(i=0;i<numsSize;i++)
    {
        if(array[0] > nums[i])
        {
            array[0] = nums[i];
        }
        if(array[1] < nums[i])
        {
            array[1] = nums[i];
        }
    }
}

int SearchGcd(int num1 , int num2)
{
    int tmp = num2 % num1;
    if(tmp == 0)
    {
        return num1;
    }
    else
    {
        return SearchGcd(tmp , num1);
    }
}

六、leecode提交截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值