最大公约数怎么算
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
如[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;
执行结果如下:
以上是关于最大公约数怎么算的主要内容,如果未能解决你的问题,请参考以下文章