更相减损术——Java实现

Java作业——求最大公约数——更相减损术

虽然算法简单,但是因为很不熟练,所以一开始的代码有较多错误,以下是经过多次修改后的代码。

代码:

import java.util.Scanner;

public class subsubAlgorithm {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入两个数字:");
        int a = sc.nextInt();
        int b = sc.nextInt();
        subsub(a, b);
//        if(a % 2 == 0) { a = a / 2; }
//        if(b % 2 == 0) { b = b / 2; }
    }

    public static void subsub(int a, int b) {
        int i = 0;
        int c = 0;

        for(; a%2 == 0 && b % 2 == 0; i ++) {
            a = a / 2;
            b = b / 2;
        }        //更相减损术第一步:若二者为偶数,则除2,并记录被2除的次数

        while(a != b) {
            if(a > b) {
                a -= b;
            } else {
                b -= a;
            }
        }        //主体,大数减小数,循环,直到两数相等为止

        if(i != 0) {
            c = b * i * 2;
        }else {
            c = b;
        }        //增加了条件判断,防止i==0的情况出现,从而得出公约数为0的错误结果

        System.out.println("最大公约数 = " + c);
    }
}

本代码验证了:

a = 996, b = 700

a = 1995, b = 615

a = 81, b = 999

等情况,似乎均可得出正确结果。但是算法仍不完美,欢迎验证并告诉我。

### 减损 C++ 实现 减损是一种古老的求最大公约数的方,最早记载于中国的《九章算》。其核心思想是通过反复比较两数大小并用较大数减去较小数的方式逐步缩小数值范围,直到两者等为止,此时的值即为所求数字的最大公约数。 以下是基于此方的 C++ 示例代码: ```cpp #include <iostream> using namespace std; // 非递归实现减损 int gcd_subtraction(int a, int b) { while (a != b) { // 当两数不等时继续循环 if (a > b) { a -= b; // 如果 a 大于 b,则将 a 减去 b } else { b -= a; // 否则将 b 减去 a } } return a; // 循环结束时,a 和 b 的值同,返回任意一个即可 } int main() { int num1, num2; cout << "请输入两个正整数:" << endl; cin >> num1 >> num2; if (num1 <= 0 || num2 <= 0) { cout << "输入错误:仅支持正整数计算!" << endl; return -1; } int result = gcd_subtraction(num1, num2); cout << "这两个数的最大公约数是:" << result << endl; return 0; } ``` 上述代码实现减损的核心逻辑[^5]。程序会不断执行减操作直至两数等,最终得到的结果就是它们的最大公约数。 #### 关键点说明 - **时间复杂度**:由于每次迭代都会减少较大的数字,因此理论上最坏情况下的时间复杂度接近 O(N),其中 N 是初始较大值与较小值之间的差值。 - **空间复杂度**:整个过程只使用了常量级额外存储单元,故空间复杂度为 O(1)[^2]。 --- ### § 1. 如何优化减损的时间复杂度? 2. 是否可以用位运算进一步改进减损? 3. 比较减损和欧几里得算在实际应用中的优劣。 4. 在处理非常大的整数时,哪种算适合?为什么? 5. 能否扩展减损来解决多个数的最大公约数问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值