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

Dart整数因数求解代码优化咨询:恳请提供改进建议

Dart整数因数查找代码的优化方案

针对你这段实现,核心的性能瓶颈和可改进点主要集中在循环效率、代码健壮性和细节优化上,以下是具体建议:

一、核心性能优化:把循环范围从O(n)降到O(√n)

原代码遍历从1到输入值的所有数,对于大数来说效率极低。实际上因数是成对出现的——如果d是n的因数,那么n/d也必然是n的因数。所以只需要遍历到√n就足够了,这样循环次数会大幅减少,比如输入100万,原代码要跑100万次,优化后只需要跑1000次。

具体实现要点:

  • 计算输入值的平方根并转为整数,作为循环的上限
  • 每次找到一个因数d,同时将d和n/d加入列表(注意当n是平方数时,d和n/d是同一个数,要避免重复添加)

二、代码细节与健壮性优化

  • 明确类型声明:给listOfFactors指定List<int>类型,避免动态类型带来的潜在问题
  • 输入异常处理:添加try-catch捕获非整数输入,同时处理空输入、小于1的输入,防止程序崩溃
  • 边界情况修复:处理输入为1的场景(1既不是质数也不是合数),原代码会因为访问listOfFactors[1]出现数组越界错误
  • 简化变量逻辑:不需要单独维护numberOfFactors,直接用listOfFactors.length获取即可
  • 优雅格式化列表:用join(', ')替代两次replaceAll,代码更简洁易读
  • 保持输出顺序:收集完因数后排序,保证输出的因数从小到大,和原代码的输出格式一致

三、优化后的完整代码

import 'dart:io';
import 'dart:math';

void main() {
  while (true) {
    stdout.write("Enter the number: ");
    final input = stdin.readLineSync();
    if (input == null) continue;

    try {
      final userInput = int.parse(input);
      if (userInput < 1) {
        print("Please enter a positive integer.");
        continue;
      }

      final List<int> listOfFactors = [];
      final sqrtNum = sqrt(userInput).toInt();

      for (int divisor = 1; divisor <= sqrtNum; divisor++) {
        if (userInput % divisor == 0) {
          listOfFactors.add(divisor);
          // 避免平方数重复添加相同因数
          if (divisor != userInput ~/ divisor) {
            listOfFactors.add(userInput ~/ divisor);
          }
        }
      }

      listOfFactors.sort();
      final formattedList = listOfFactors.join(', ');

      if (userInput == 1) {
        print("The number 1 is neither prime nor composite.");
      } else if (listOfFactors.length == 2) {
        print("Provided number is prime, because it has only two factors: ${listOfFactors[0]} and ${listOfFactors[1]}");
      } else {
        print("Provided number is not prime, and the factors are ${formattedList}");
      }
    } on FormatException {
      print("Invalid input! Please enter a valid integer.");
    }
  }
}

额外说明

  • 优化后的代码在处理大数时性能提升极其显著,比如输入109,原代码需要遍历109次,优化后仅需约3万次循环
  • 新增的输入校验让程序更健壮,不会因为用户的错误输入直接崩溃
  • 排序后的因数列表保持了和原代码一致的输出顺序,不会改变用户习惯的展示结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:07:38