一只小美袁 2023-11-26 16:05 采纳率: 100%
浏览 7
已结题

c++在函数里输出会运行超时

这是洛谷B2127的问题:
题目描述
求正整数 2 和 n之间的完全数(一行一个数)。
完全数:对于一个自然数,所有比它小的所有因数之和,等于它本身,它就是个完全数。如 6=1+2+3。
输入格式
输入 n (n<=10000)。
输出格式
一行一个数,按由小到大的顺序。
这是我写的代码:

 #include<iostream>
using namespace std;
int function(int i)
{
    int  sum=0; 
    for(int j=1;j<i;j++)
    {
        if(i%j==0)
            sum+=j;
    }
    if(sum==i)
    cout<<i<<endl;
}
int main()
{
    int n;
    cin>>n;
    for(int i=2;i<=n;i++)
    {
        function(i);
        
    }
    return  0;
 } 

洛谷答案显示运行超时,后面我去搜索正确的代码:

#include<iostream>
using namespace std;
int function(int i)
{
    int  sum=0; 
    for(int j=1;j<i;j++)
    {
        if(i%j==0)
            sum+=j;
    }
    return sum;
}
int main()
{
    int n;
    cin>>n;
    for(int i=2;i<=n;i++)
    {
        if(function(i)==i)
        cout<<i<<endl;
        
    }
    return  0;
 } 

我觉得两者的区别就是我是在函数里去输出值,而别人的代码是在函数里返回因数的和,再在主函数里判断然后输出答案,我不明白为什么我在函数里输出就会运行超时(我的代码运行结果是正确的)
感谢你看到这里,可以帮我解答下吗感谢您

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-26 19:05
    关注

    【以下回答由 GPT 生成】

    在函数中输出结果导致运行超时的原因可能是每次输出都需要在屏幕上显示,这个过程相对较慢。主函数中输出答案时,可能只是将结果保存在一个变量中,不需要实时显示在屏幕上,所以更快。

    为了优化代码以避免运行超时问题,可以考虑以下几点:

    1. 尽量避免在循环或递归中频繁地输出结果。可以将输出语句放在循环或递归结束后执行,减少输出次数。

    2. 考虑将输出结果保存在一个列表或字符串中,等处理完成后再一次性输出。这样可以减少输出操作的次数。

    下面是一个示例的代码片段,演示了如何将结果保存在列表中来避免运行超时问题:

    def calculate_sum(n):
        factors = []
        for i in range(1, n+1):
            if n % i == 0:
                factors.append(i)
    
        return factors
    
    def main():
        n = 100
        result = calculate_sum(n)
        output = ', '.join(str(x) for x in result)  # 将结果组合成一个字符串
        print(f"The factors of {n} are: {output}")
    
    main()
    

    上述示例中,calculate_sum()函数计算出因子并返回一个列表。在main()函数中,我们将列表中的每个元素转换为字符串,并使用逗号分隔,然后在一次性输出。

    通过这种方式,我们可以减少输出次数,从而提高代码的执行效率,避免了运行超时的问题。



    【相关推荐】


    • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7546011
    • 除此之外, 这篇博客: C与C++程序设计学习笔记中的 8、一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数。比如121,2332 都是回文数,13,4567不是回文数。任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得到一个新的数,如果新数不是回文数,重复这个变换,直到得到一个回文数为止。例如,57变换后得到132(57 + 75),132得到363(132 + 231)),363是一个回文数。曾经有数学家猜想:对于任意正整数,经过有限次上述变换以后,一定能得出一个回文数。至今这个猜想还没有被证明是对的。现在请你通过程序来验证。 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月4日
  • 已采纳回答 11月26日
  • 创建了问题 11月26日

悬赏问题

  • ¥15 关于一个倒计时的操作和显示设计
  • ¥15 提问STK的问题,哪位航天领域的同学会啊
  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop
  • ¥15 共享文件夹会话中为什么会有WORKGROUP
  • ¥15 关于#python#的问题:使用ATL02数据解算光子脚点的坐标(操作系统-windows)
  • ¥115 关于#python#的问题:未加密前两个软件都可以打开,加密后只有A软件可打开,B软件可以打开但读取不了数据
  • ¥15 在matlab中Application Compiler后的软件无法打开