You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中如何判断整数i可一次性整除列表所有元素以求解最大公约数

Dart 求解列表最大公约数方案

现有代码修复

你当前的错误点是不能直接对列表_num做取模运算,需要遍历列表所有元素判断是否都能被i整除,Dart 列表内置的every方法可以直接实现这个逻辑,修复后代码如下:

_num.sort();
List<int> _answer = [];

for (int i = 1; i <= _num.last; i++) {
  // 判断所有元素都可被i整除且余数为0
  if (_num.every((element) => element % i == 0)) {
    _answer.add(i);
  }
}
// 遍历结束后_answer最后一个元素就是最大公约数
int finalGcd = _answer.last;

这个暴力遍历的方案适合小数值场景,数值过大会存在性能问题。

更优实现:辗转相除法(欧几里得算法)

该算法时间复杂度远低于暴力遍历,实现逻辑是先写两个数的最大公约数计算函数,再对列表做两两迭代计算即可,代码示例如下:

// 计算两个非负整数的最大公约数
int calculateGcd(int a, int b) {
  // 处理负数场景可先对a、b取绝对值
  while (b != 0) {
    final temp = b;
    b = a % b;
    a = temp;
  }
  return a;
}

// 计算整个整数列表的最大公约数
int calculateListGcd(List<int> numList) {
  // 可自行添加空列表、单元素列表的边界校验
  return numList.reduce(calculateGcd);
}

// 调用测试
void main() {
  List<int> _num = [16, 24, 32];
  print(calculateListGcd(_num)); // 输出结果为8
}

内容的提问来源于stack exchange,提问作者Somxhai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:54:04