初学者想知道哪里运行超时了

问题遇到的现象和发生背景
用代码块功能插入代码,请勿粘贴截图
我想要达到的结果

img


#include
#include
void main()
{
int m,n,a=0,b=0,i=0,j,sum=0;
scanf("%d %d",&m,&n);
for(a=m;a<=n;a++)
{sum=0;i=0;
for(b=1;b
{
if(a%b==0)
{
sum+=b;
}

    }i=0;
 for(b=1;bif(sum%b==0)
         i+=b;
 }
 if(i==a&&sum"%d %d\n",sum,a);
 else continue;
}

}

img

输入的两个数没有取值范围吗?
你这个计算质因数的效率比较低

#include<stdio.h>
#include<math.h>
void main()
{
    int m,n,a=0,b=0,i=0,j,sum=0;
    scanf("%d %d",&m,&n);
    for(a=m;a<=n;a++)
    {
        sum=1;i=0;
        int k = sqrt(a*1.0);
        for(b=2;b<=k;b++)
        {
            if(a%b==0)
            {
                sum+=b;
                if(b*b != a)
                    sum += a/b;
            }
        }
        i=1;
        k = sqrt(sum*1.0);
        for(b=2;b<=k;b++)
        {
            if(sum%b==0)
            {
                i+=b;
                if(b*b != sum)
                    i += sum/b;
            }
        }
        if(i==a&&sum<a)
            printf("%d %d\n",sum,a);
        else 
            continue;
    }
    return 0;
}

计算因子这里有个技巧,应为因子是围绕根号n成对出现的,因此我们循环时不必循环到n,只需要循环到根号n即可,找到一个因子f,另一个因子就是n/f。这样事件复杂度就从O(n),变成了O(根号n),会有几个数量级的提升。

#include <stdio.h>

int sum_factor(int n) {
    int i, sum = 1;
    for (i = 2; i * i < n; i++) {
        if (n % i == 0) {
            sum += i;
            sum += n / i;
        }
    }
    if (i * i == n) {
        sum += i;
    }
    return sum;
}

int main() {
    int m, n;
    scanf("%d %d", &m, &n);
    for (int i = m; i <= n; i++) {
        int f1 = sum_factor(i);
        if (f1 > i && f1 <= n) {
            int f2 = sum_factor(f1);
            if (f2 == i) {
                printf("%d %d\n", i, f1);
            }
        }
    }
    return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632