鱼C论坛

 找回密码
 立即注册
查看: 2101|回复: 10

[已解决]关于小甲鱼C语言阶段测试题目的问题

[复制链接]
发表于 2022-5-26 21:16:00 | 显示全部楼层 |阅读模式
60鱼币
本帖最后由 zyxzyx。 于 2022-5-26 21:16 编辑

. 编写一个程序,求解 600851475143 的最大质数因子是多少?
上面这个是题目


/*先判断是不是除数,在判断除数是不是质数*/

#include<stdio.h>
int main()
{
    long long i,d,a,re,sum=600851475143;
    _Bool flag=1;
    for(i=2;i<sum;i++)
    {
        if(sum%i==0)
        {
            
            for(a=2;a<=i/2;a++)
            {
                if(i%a==0)
                {
                    flag=0;
                    break;
                }

            }
            if(flag)
            {
                re=i;
            }
            else
            {
                flag=1;
            }
        }
    }
printf("%d",re);
return 0;
}
这个是我的代码,但是我运行代码迟迟没有结果,当我把sum的值改小,就是去求一个更小的数的最大质因数的时候就可以出结果,
我觉得可能是我算法上的缺陷,但是我不知道我的算法比答案代码的算法差在哪里。求解答
下面是答案的代码

#include <stdio.h>
#include <math.h>

int main()
{
        long long i, j, k, l, num = 600851475143;
        _Bool flag = 1;

        for (i = 2, j = num/i; flag != 0; i++, j = num/i, flag = 1)
        {
                if (i * j == num)
                {
                        k = sqrt((double)j);
                        for (l = 2; l <= k; l++)
                        {
                                if (j % l == 0)
                                {
                                        flag = 0;
                                        break;
                                }
                        }
                        if (flag)
                        {
                                break;
                        }
                }
        }
        printf("%lld\n", j);
        return 0;
}
最佳答案
2022-5-26 21:16:01
本帖最后由 jhq999 于 2022-5-26 23:00 编辑

long long i=0,sum=600851475143;
    for(i=2;i<sum;i++)
    {
        if(sum%i==0)
        {
            sum=sum/i;
            i=1;
        }
    }
    printf("%lld",sum);

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-26 21:16:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-5-26 23:00 编辑

long long i=0,sum=600851475143;
    for(i=2;i<sum;i++)
    {
        if(sum%i==0)
        {
            sum=sum/i;
            i=1;
        }
    }
    printf("%lld",sum);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-26 23:42:23 | 显示全部楼层
答案代码:从大因子开始往回遍历,判断是否为质数,发现的第一个质数就是结果,并且直接break终止循环
你的代码:从小因子开始遍历,即使判断为质数,还是得往下继续,直到i=sum循环终止

这性能差距很明显吧。要是题目求最小质数因子,你的倒是满足要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2022-5-27 10:02:40 | 显示全部楼层
本帖最后由 jhq999 于 2022-5-27 10:07 编辑


1、一个数的最小因子一定是质因子,最小因子对应的就是这个数的最大因子
2、一个数的最大因子的最大质因子也是这个数的最大质因子
3、根据上面两条套娃直到找到这个数最大因子的最大因子……的最大质因子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-27 10:34:34 | 显示全部楼层
风车呼呼呼 发表于 2022-5-26 23:42
答案代码:从大因子开始往回遍历,判断是否为质数,发现的第一个质数就是结果,并且直接break终止循环
你 ...

答案代码不也是从小因子开始的吗
也是先找因子在判断因子是不是质数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-27 10:35:55 | 显示全部楼层
jhq999 发表于 2022-5-27 10:02
1、一个数的最小因子一定是质因子,最小因子对应的就是这个数的最大因子
2、一个数的最大因子的最大质 ...

那我的代码跟他那个答案代码的差距在哪里
求大佬解答
都是从小的数开始先找因子再判断因子是不是质数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-27 10:55:45 | 显示全部楼层
本帖最后由 jhq999 于 2022-5-27 11:24 编辑
zyxzyx。 发表于 2022-5-27 10:35
那我的代码跟他那个答案代码的差距在哪里
求大佬解答
都是从小的数开始先找因子再判断因子是不是质数


这么大的数你从最小挨个取余试得啥时候去
上面的已经给你回答了
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-27 11:57:43 | 显示全部楼层
zyxzyx。 发表于 2022-5-27 10:34
答案代码不也是从小因子开始的吗
也是先找因子在判断因子是不是质数

好好看看判断质数那块的代码。。。你判断的是 i ,人家判断的是 num/i
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-5 10:53:06 | 显示全部楼层
为什么我参考程序跑出来的结果是个合数啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-6-26 19:23:46 | 显示全部楼层
风共我 发表于 2022-6-5 10:53
为什么我参考程序跑出来的结果是个合数啊

他给的答案好像最后一步输出的变量写错了
我帖子上的是改过的答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 10:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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