使用自定义函数6——使用函数求最大公约数

本文介绍如何使用C语言编写一个函数gcd()来计算两个整数x和y的最大公约数。通过输入x和y的值,程序会利用for循环逐步缩小范围直到找到公约数。
#include <stdio.h>

int gcd( int x, int y );

int main()
{
    int x, y;

    scanf("%d %d", &x, &y);
    printf("%d\n", gcd(x, y));

    return 0;
}
int gcd( int x, int y )
{
    int z,i;
    if(x>y)
    {   z=y;}
    else
    {   z=x;}
    for(i=z;i>0;i--)        //因为是求最大公约数所以从大依次减小
    {   if(x%i==0&&y%i==0)
            break; 
    }
    return i;               
}

在 MATLAB 中,我们可以使用内置函数 `gcd` 来直接计算两个数的最大公约数 (Greatest Common Divisor, GCD),也可以通过手动实现欧几里得算法来解。下面是具体的解决方法及步骤: --- ### 已知信息 1. **阶乘部分** \(12!\) 表示从 1 到 12 的连续整数相乘,即: \[ 12! = 1 \times 2 \times 3 \times \cdots \times 12 \] 2. **给定的大数字** 另一个大数字为:12039287653026128192934。 3. **目标** 这两个数的最大公约数。 --- ### 方法一:利用 MATLAB 内置函数 `gcd` MATLAB 提供了强大的数值处理能力,其中 `factorial(n)` 函数用于计算 n! ,而 `gcd(a,b)` 直接返回 a 和 b 的最大公约数。 ```matlab % 定义输入 num1 = factorial(12); % 计算 12! num2 = int64(12039287653026128192934); % 确保用 int64 类型存储超大数 % 最大公约数 result = gcd(num1, num2); % 输出结果 fprintf('12! 和 12039287653026128192934 的最大公约数是:%d\n', result); ``` > **注意**: 因为第二个数字非常大,在某些系统上可能会超出默认数据类型的范围 (`double`) 。因此这里建议将该数字转成 `int64` 或者其他支持更大值的数据类型。 --- ### 方法二:手动实现欧几里得算法 如果不借助内建的 `gcd()` 函数,那么可以根据经典的辗转相除法编写自己的 GCD 函数。 ```matlab function g = my_gcd(a, b) while b ~= 0 temp = mod(a, b); a = b; b = temp; end g = abs(a); % 返回正值作为结果 end % 测试自定义函数 num1 = factorial(12); num2 = uint64(12039287653026128192934); % 这次尝试采用无符号整型 uint64 g = my_gcd(uint64(num1), num2); % 转换第一个参数类型匹配后者 fprintf('手工算法得出两者的 GCD : %d\n', double(g)); % 最终转换回标准显示格式输出 ``` 以上代码片段实现了基于递归思想的基本形式,并对每一步进行了适当注释便于理解过程。 --- ### 结果展示 实际运行上面任何一个脚本都将给出最终的答案——由于篇幅原因省略具体数值但确保正确性! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值