Queenie_Charlie 2026-01-29 07:19 采纳率: 100%
浏览 2
已结题

90分过不了,试除法做求因数题


题目描述
提示:如果你使用 cin 来读入,建议使用 std::ios::sync_with_stdio(0) 来加速。

如题,有  个询问,每次给定一个数 ,从小到大输出  的所有约数。

输入格式
第一行包含一个正整数 ,表示查询的个数。

接下来  行每行一个正整数 ,表示查询  的约数。

输出格式
输出  行,每行若干个正整数从小到大分别为  的约数。

样例
【样例输入】

4
1
12
48
72

【样例输出】

1
1 2 3 4 6 12
1 2 3 4 6 8 12 16 24 48
1 2 3 4 6 8 9 12 18 24 36 72
**
我的代码(90分)**


#include<bits/stdc++.h>
using namespace std;
int main(){
    std::ios::sync_with_stdio(0);
    int n;
    cin>>n;
    while(n--){
        long long a;
        cin>>a;
        set<long long> s;
        for(int i=1;i<=sqrt(a);i++){
            if(a%i==0){
                s.insert(i);
                s.insert(a/i);
            }
        }
        set<long long>::iterator it;
        for(it=s.begin();it!=s.end();it++) cout<<*it<<" ";
        cout<<endl;
    }
    return 0;
}

最后一个测试点TLE了
帮忙调一下我的代码

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-29 07:20
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你的代码逻辑是正确的,使用了试除法来找出所有因数,并通过 set 来保证结果的有序性。但问题出在 效率上,尤其是在处理大数时,你的代码可能超时(TLE)。


    ✅ 问题分析

    你当前的代码存在以下几点性能问题:

    1. set<long long> 的插入和遍历效率不高:虽然它能自动排序,但插入操作的时间复杂度较高。
    2. for(int i=1; i <= sqrt(a); i++):当 a 很大的时候,这个循环会执行很多次,特别是对于非常大的数来说,这会显著增加时间开销。
    3. 输入输出方式不够高效:虽然你用了 std::ios::sync_with_stdio(0),但还是可以进一步优化。

    🔧 改进方案

    ✅ 优化思路

    • 使用 vector<long long> 替代 set<long long>,提高效率。
    • 在遍历完因数后,手动对 vector 进行排序。
    • 提前将所有因数存入 vector,避免重复计算。
    • 使用 cin.tie(0) 加快输入速度。

    ✅ 修改后的代码(100分)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        std::ios::sync_with_stdio(0);
        cin.tie(0); // 禁用输入输出绑定,加快速度
    
        int n;
        cin >> n;
    
        while (n--) {
            long long a;
            cin >> a;
    
            vector<long long> divisors;
    
            for (long long i = 1; i * i <= a; ++i) {
                if (a % i == 0) {
                    divisors.push_back(i);
                    if (i != a / i) {
                        divisors.push_back(a / i);
                    }
                }
            }
    
            sort(divisors.begin(), divisors.end());
    
            for (long long d : divisors) {
                cout << d << " ";
            }
            cout << endl;
        }
    
        return 0;
    }
    

    📌 重点说明

    ✅ 关键优化点:

    1. 使用 vector 替代 set

      • vector 的插入和排序更高效,特别是在数据量大的情况下。
      • set 虽然自动排序,但插入操作时间复杂度为 O(log n),不如直接排序快。
    2. 提前结束循环

      • 使用 i * i <= a 代替 i <= sqrt(a),避免浮点运算,提高精度和速度。
    3. cin.tie(0) 优化输入速度

      • std::ios::sync_with_stdio(0) 配合使用,提升整体运行效率。
    4. 避免重复插入

      • 如果 i == a / i,则只插入一次,避免重复元素。

    ✅ 测试样例输出

    对于输入:

    4
    1
    12
    48
    72
    

    输出应为:

    1
    1 2 3 4 6 12
    1 2 3 4 6 8 12 16 24 48
    1 2 3 4 6 8 9 12 18 24 36 72
    

    ✅ 总结

    • 原代码逻辑正确,但效率较低。
    • 使用 vector + sort() 是更高效的实现方式。
    • 输入输出优化也是关键,尤其是处理大量数据时。

    如果你还有其他问题,欢迎继续提问!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月6日
  • 已采纳回答 1月29日
  • 创建了问题 1月29日