最大公约数怎么算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大公约数怎么算相关的知识,希望对你有一定的参考价值。

辗转相除法和更相减损术以及短除法都可以求最大公约数
1.辗转相除法
例:求80和36的最大公约数
80=36*2+8
36=8*4+4
8=4*2+0
所以最大公约数是42

算法:就是用小数除大数,如果余数不是零,就把余数和较小的数构成一组新数,继续上面的除法,知道大数被小数约尽,此时比较小的数就是最大公约数

2.更相减损术
还是上面的那个例子 可以用更相减损术计算
80-36=44
44-36=8
36-8=28
28-8=20
20-8=12
12-8=4
8-4=4
算法:用大数减去小数,将差和较小的数构成一对新数,再用大数减去小数 一直到差与较小数相等 此时差就是最大公约数
3.短除法
这个就是小学生要求学会的了 “cute熊仔旺旺”回答的还可以啦 楼主可以参考一下

参考资料:高中数学 必修3:小学数学 六年级上册

参考技术A

    如果数小的话,用列举法即可

    如:(12,18)

    12的正约数:1,2,3,4,6,12

    18的正约数:1,2,3,6,9,18

    所以(12,18)=6

    如果数较大的话用辗转相除法:按以下式子循环下去:较大的数=较小的数×a1+n1,较小的数=n1×a2+n2,n1=n2×a3+n3......n(k-2)下标=n(k-1)下标×ak下标+nk下标,直到nk=0时结束,这两个数的最大公约数为n(k-1)下标

    例如:(12345,765)

    12345=765×16+105

    765=105×7+30

    105=30×3+15

    30=15×2

    所以(12345,765)=15

参考技术B 1、写出这几个数的所有约数,然后选择其中最大的一个;比如求6、8、10的最大公约数。6有约数1、2、3、6;8有1、2、4、8;10有1、2、5、10。公约数有1、2,其中最大的是2; 2、分解质因数法:还以6、8、10为例:6=2x3,8=2x2x2,10=2x5,其中共有的是2,所以它们的最大公约数是2(没有时是1); 3、最常用的是短除法:选择它们共有的约数做除数,分别除以2以后还余下3、4、5,只要有其中两个数互质就算完成(这个不同于求最小公倍数,那是要除到任何两个数都互质为止。 参考技术C a*b/(a,b)
如[15,25]=15*25/(15,25)=15*25/5=75
参考技术D 短除法
5 |__10______5_____ 那么(10,5)=5
2 1

2022-06-17:给定一个数组arr,含有n个数字,可能有正有负有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大,怎么算最快? 来自Amazon。

2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0,
给定一个正数k。
返回所有子序列中,累加和最大的前k个子序列累加和。
假设K不大,怎么算最快?
来自Amazon。

答案2022-06-17:

排序,小根堆。

代码用rust编写。代码如下:

fn main() 
    let mut nums: Vec<i32> = vec![6, 19, 3, 8, 29];
    let ans = top_max_sum2(&mut nums, 3);
    println!("ans = :?", ans);


fn top_max_sum2(arr: &mut Vec<i32>, k: i32) -> Vec<i32> 
    let mut sum = 0;
    for i in 0..arr.len() as i32 
        if arr[i as usize] >= 0 
            sum += arr[i as usize];
         else 
            arr[i as usize] = -arr[i as usize];
        
    
    let mut ans = top_min_sum(arr, k);
    for i in 0..ans.len() as i32 
        ans[i as usize] = sum - ans[i as usize];
    
    return ans;


fn top_min_sum(arr: &mut Vec<i32>, k: i32) -> Vec<i32> 
    arr.sort();
    // (最右的下标,集合的累加和)
    let mut heap: Vec<Vec<i32>> = vec![];
    heap.push(vec![0, arr[0]]);
    let mut ans: Vec<i32> = vec![];
    for _ in 0..k 
        ans.push(0);
    
    // ans[0] = 0
    // 0 1 2  k-1
    // k个!
    for i in 1..k 
        heap.sort_by(|a, b| b[1].cmp(&a[1]));
        let cur = heap.pop().unwrap();
        // (7, 100)
        // 左 :8, 100 - arr[7] + arr[8]
        // 右 :8, 100 + arr[8]
        let last = cur[0];
        let sum = cur[1];
        ans[i as usize] = sum;
        if last + 1 < arr.len() as i32 
            heap.push(vec![
                last + 1,
                sum - arr[last as usize] + arr[(last + 1) as usize],
            ]);
            heap.push(vec![last + 1, sum + arr[(last + 1) as usize]]);
        
    
    return ans;


执行结果如下:


左神java代码

以上是关于最大公约数怎么算的主要内容,如果未能解决你的问题,请参考以下文章

lcm怎么算

计数器最大模值怎么算

数学函数区间的最小值与最大值怎么算

7的逆元怎么算

c语言:输入是一个n*m的矩阵,要求找到其中最大的全0字矩阵。怎么算?

求连续序列的最大子序列和