鱼C论坛

 找回密码
 立即注册
查看: 1654|回复: 2

[已解决]小甲鱼的C第一阶段考察的超大数做质因子分解,为啥时间很长?

[复制链接]
发表于 2022-10-18 11:04:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 texttext 于 2022-10-18 11:22 编辑

原题是求解600851475143的最大质数因子, 我的代码如下:

这段代码在数字不是很大的时候,比如7位数,还是可以运行的。但是一旦超过7位数,就不行了。 但是小甲鱼说如果3秒钟不出答案,肯定就不对。 那位大神指点一下,代码有什么问题?



long long number = 851143;
long long maxfactor = 1;
_Bool flag = 1;

for (long long i = 2; i < number; i++)
{

        if (number % i == 0)
        {
            flag = 1;
            
        
        for (long long j = 2; j <= sqrt(i); j++)
        {
            if (i % j == 0)
            {
                flag = 0; //i is not a prime factor
                break;
            }
        }
        
        if (flag) //prime factor
            {
               
                if (i >= maxfactor)
                {
                    maxfactor = i;
                }
            }
        }
   
}
printf("max prime factor is %d\n", maxfactor);
最佳答案
2022-10-18 11:23:00
本帖最后由 jackz007 于 2022-10-18 11:35 编辑

        因为这个数超过了 int 的表达范围,所以,需要全程改用 long long。
#include <stdio.h>

int main(void)
{
        unsigned long long c , d , k , n                        ;
        n = 600851475143                                        ;
        for(c = 0 , d = n , k = 2 ; k * k < d + 1 ;) {
                if(! (d % k)) {
                        if(! c) printf("%I64u = %I64u" , n , k) ;
                        else printf(" x %I64u" , k)             ;
                        d /= k                                  ;
                        c ++                                    ;
                } else {
                        k ++                                    ;
                }
        }
        if(! c) printf("%I64u is a prime .\n" , n)              ;
        else printf(" x %I64u\n" , d)                           ;
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
600851475143 = 71 x 839 x 1471 x 6857

D:\[00.Exerciese.2022]\C>
       这个代码确实很快,确实要不了 3 秒钟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-18 11:23:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-18 11:35 编辑

        因为这个数超过了 int 的表达范围,所以,需要全程改用 long long。
#include <stdio.h>

int main(void)
{
        unsigned long long c , d , k , n                        ;
        n = 600851475143                                        ;
        for(c = 0 , d = n , k = 2 ; k * k < d + 1 ;) {
                if(! (d % k)) {
                        if(! c) printf("%I64u = %I64u" , n , k) ;
                        else printf(" x %I64u" , k)             ;
                        d /= k                                  ;
                        c ++                                    ;
                } else {
                        k ++                                    ;
                }
        }
        if(! c) printf("%I64u is a prime .\n" , n)              ;
        else printf(" x %I64u\n" , d)                           ;
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
600851475143 = 71 x 839 x 1471 x 6857

D:\[00.Exerciese.2022]\C>
       这个代码确实很快,确实要不了 3 秒钟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-10-18 11:32:09 | 显示全部楼层
jackz007 发表于 2022-10-18 11:23
因为这个数超过了 int 的表达范围,所以,需要全程改用 long long。

        编译、运行实况:
...

编译器能给个提示,数字太大内存溢出就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 11:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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