鱼C论坛

 找回密码
 立即注册
查看: 1873|回复: 4

[已解决]各位c语言大神进来看看!

[复制链接]
发表于 2022-6-5 17:10:32 | 显示全部楼层 |阅读模式
60鱼币
以下是求3000以内亲密数的代码,第一个代码无法运行,第二个代码可以正常编译,他俩的区别就在于第一个是在for循环外面赋值的,按常理来说不是应该在for循环外面赋值更好么?为啥反而编译不了了??
#include<stdio.h>
int main()
{
        int a,i,b=0,n=0;
        printf("下面是3000以内的亲密数:\n");
        for(a=1;a<3000;a++)
        {
                for(i=1;i<=a/2;i++)
                         if(!(a%i))
                         b+=i;
                for(i=1;i<=b/2;i++)
                if(!(b%i))
                n+=i;
                if(n==a && a<b)
                printf("%4d %4d    ",a,b);
                }
        }

***************************
#include<stdio.h>
int main()
{
        int a,i,b,n;
        printf("下面是3000以内的亲密数:\n");
        for(a=1;a<=3000;a++)
        {       
                for(b=0,i=1;i<=a/2;i++)
                if((a%i==0))
                        b+=i;
                        for(n=0,i=1;i<=b/2;i++)
                        if(!(b%i))
                        n+=i;
                        if(n==a &&a <b)
                        printf(" %4d %4d   ",a,b);
                }
        }
最佳答案
2022-6-5 17:10:33
因为最外层循环,也就是对每一个 a 进行计算时,都需要重置 b 和 n 为0。内层for循环要是只运行一次,那可以放到外面赋值,但是外面套了一层循环,运行不止一次,当然每次就需要重置一下 b 、 n

最佳答案

查看完整内容

因为最外层循环,也就是对每一个 a 进行计算时,都需要重置 b 和 n 为0。内层for循环要是只运行一次,那可以放到外面赋值,但是外面套了一层循环,运行不止一次,当然每次就需要重置一下 b 、 n
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-5 17:10:33 | 显示全部楼层    本楼为最佳答案   
因为最外层循环,也就是对每一个 a 进行计算时,都需要重置 b 和 n 为0。内层for循环要是只运行一次,那可以放到外面赋值,但是外面套了一层循环,运行不止一次,当然每次就需要重置一下 b 、 n
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-6-5 17:22:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-5 17:49:44 | 显示全部楼层
第一个代码
b = 0 只执行一次(在外面执行),所以 b 值会随着循环越变越大

第二个代码
b = 0 执行至少 3000 次,每次 a 循环,b 又变回 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-5 19:26:48 | 显示全部楼层
本帖最后由 jhq999 于 2022-6-5 19:35 编辑

楼上已经回答了你的代码我给你优化一下
#include<stdio.h>
int main()
{
        int a,i,b,n,m;
        printf("下面是3000以内的亲密数:\n");
        for(a=1;a<=300000;a++)
        {
            m=a/2;
                for(b=0,i=1;i<m;i++)
                {
                    m=a/i;
                    if((a%i==0))b+=i+m;

                }
                    b-=a;
                    m=b/2;
                for(n=0,i=1;i<m;i++)
                {
                    m=b/i;
                    if(!(b%i))n+=i+m;
                }

                    n-=b;
                if(n==a &&a <b)
                    printf(" %4d %4d   ",a,b);
                }
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 12:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表