Project-Euler-003思维+线性筛

本文通过优化算法,解决了寻找大数600851475143最大质因数的问题。采用线性筛法和平方根优化技巧,将时间复杂度从1e22降至1e6,最终确定最大质因数为6857。

题意:

​ 13195的所有质因数为5、7、13和29。

​ 600851475143最大的质因数是多少?

思路:

​ 600851475143大概是6e11,如果纯暴力找它的每个因子,然后再判断每个因子是不是质数,时间复杂度大约是1e22,家用电脑估计一个小时也跑不完吧~

​ 有些人继续优化,说可以用线性筛求[2,600851475143]范围内的质数,然后找最大满足是600851475143因子的质数。这样时间复杂度是1e11,家里电脑依然跑不完~而且线性筛需要开两个1e11的数组分别用来判断是否为质数和存质数,我们无法开这么大的数组。

​ 这时候,我们就需要明白一点,600851475143的临界值是多少?嗯,这个数的临界值为(int)(sqrt(600851475143)),为什么呢?

​ 仔细想一下,如果最大质因子小于等于(int)(sqrt(600851475143)),那么我们只需要线性筛前(int)(sqrt(600851475143))就可以找出它的最大质因子。

​ 如果最大质因子大于(int)(sqrt(600851475143)),那么600851475143中不可能同时存在两个大于(int)(sqrt(600851475143))的质因子(如果存在,两个质因子相乘就大于600851475143啦),所以我们可以通过除以(int)(sqrt(600851475143))以内所有600851475143的质因子,最后剩下的数,就是大于(int)(sqrt(600851475143))的质因子。

​ 而(int)(sqrt(600851475143))为775146,用线性筛求775146范围内的质数时间复杂度只有1e6左右,家用电脑一秒钟以内肯定能求出来~

代码如下:

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <inttypes.h>
#define ll int64_t
#define d int32_t
#define len 775150
ll n = 600851475143;
//prime[]用于存素数
d prime[len];
//choose[i]用于判断i是否为素数,0是,1不是
bool choose[len];

ll init() {
    ll maxx = 0; 	//用来存储最大的质因子
    prime[0] = 0; 	//用来记录质数个数
    memset (choose, 0, sizeof(choose));
    for (d i = 2; i < len; i ++) {
        if (!choose[i]) {
        	//如果i是素数就添加到prime中
            prime [++prime[0]] = i;
            //如果i是不断缩小的n的因子,则n循环累除i
            if(n % i == 0) {
                while (n % i == 0) {
                    n /= i;
                }
                //更新质因子的最大值
                maxx = i;
            }
        }
        //线性筛的性质
      	for (d j = 1; j <= prime[0] && i * prime[j] < len; j++) {     
            choose[i * prime[j]] = 1;
            if (i % prime[j] == 0) {
                break;
            }
        }
    }
    //如果此时n不为1,说明最大质因子大于(int)sqrt(600851475143)
    if (n != 1) {
        maxx = n; //那么更新最大质因子
    }
    return maxx;	//最后返回值即为结果
}

int main() {
    ll ans = init();
    printf("%" PRId64"\n", ans);
    return 0;
}

​ 最后输出答案为6857 ,Over~

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢!

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值