查看: 2981|回复: 62

[C/C++] @xiaomeng242 求10000以内的最大质数本人答案

[复制链接]

1

技术

14

魅力

1

原创

退休版主

Rank: 8Rank: 8

积分
8180
人气
416
分享
59

论坛元老活跃会员灌水之王荣誉管理

发表于 2022-8-9 10:51:28 | 显示全部楼层 |阅读模式
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;

bool check(int n);
        
int main()
{
        int j = 0;
        for (int i = 0; i <= 10000; i++) {
                j = 10000 - i;
                if (check(j) == true) {
                        cout<< j;
                        break;
                }
        }
}

bool check(int n) {
    int q = 1, w = 2, p = n;
    while(p > 0) {
        if ((p % 2) != 0) {
                        q = q * w % n;
                }
        w = w * w % n;
        p = p / 2;
    }
    if ((q - 2) % n == 0) {
                return true;
        }
        else {
                return false;
        }
}


别问我为什么来写C++了,因为Rust的生命周期快把我弄死了。。
这个算法虽然在数学上不成立,但是我认为这里投机取巧应该问题不大。虽然我代码写的稀烂
参考了快速幂取模,用了啥算法你猜.
另外我目前没办法编译并添加计时的东西,等会儿有机会加。

评分

参与人数 1人气 +3 收起 理由
xiaomeng242 + 3

查看全部评分

1

技术

25

魅力

7

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
11343
人气
297
分享
42

论坛元老优秀版主活跃会员最佳新人灌水之王

发表于 2022-8-9 13:25:45 | 显示全部楼层
费马小定理?

评分

参与人数 1人气 +3 收起 理由
JimmyzZZ + 3 正确答案

查看全部评分

Just do it.

0

技术

1

魅力

0

原创

略知一二

Rank: 3Rank: 3

积分
902
人气
25
分享
0
发表于 2022-8-9 15:52:26 | 显示全部楼层
肯定是 快速幂取模算法了

有空你把时间计算的加一下,看看谁的快

1

技术

14

魅力

1

原创

退休版主

Rank: 8Rank: 8

积分
8180
人气
416
分享
59

论坛元老活跃会员灌水之王荣誉管理

 楼主| 发表于 2022-8-9 16:15:35 | 显示全部楼层
xiaomeng242 发表于 2022-8-9 15:52
肯定是 快速幂取模算法了

有空你把时间计算的加一下,看看谁的快  ...

其实核心是费马小定理
本来想用威尔逊的算法的但是太慢了

0

技术

1

魅力

0

原创

略知一二

Rank: 3Rank: 3

积分
902
人气
25
分享
0
发表于 2022-8-9 16:37:15 | 显示全部楼层
JimmyzZZ 发表于 2022-8-9 16:15
其实核心是费马小定理
本来想用威尔逊的算法的但是太慢了

我用的是 埃拉托斯特尼筛法,用Python不到6ms就算了出来。、
如果放上修饰器的话,速度就接近于c++了
待会上代码

1

技术

14

魅力

1

原创

退休版主

Rank: 8Rank: 8

积分
8180
人气
416
分享
59

论坛元老活跃会员灌水之王荣誉管理

 楼主| 发表于 2022-8-9 20:28:33 | 显示全部楼层
xiaomeng242 发表于 2022-8-9 16:37
我用的是 埃拉托斯特尼筛法,用Python不到6ms就算了出来。、
如果放上修饰器的话,速度就接近于c++了
待 ...

[C++] 纯文本查看 复制代码
#include <iostream>
#include <cstdio>
using namespace std;

bool check(int n);

int main()
{
    string readkey = "";
    clock_t start = clock();
    int j = 0;
    for (int i = 0; i <= 10000; i++) {
        j = 10000 - i;
        if (check(j) == true) {
            cout << j << endl << "Time: " << clock() - start << "ms" << endl;
            cin >> readkey;
            break;
        }
    }
}

bool check(int n) {
    int q = 1, w = 2, p = n;
    while (p > 0) {
        if ((p % 2) != 0) {
            q = q * w % n;
        }
        w = w * w % n;
        p = p / 2;
    }
    if ((q - 2) % n == 0) {
        return true;
    }
    else {
        return false;
    }
}


我这里可能是精度不够,显示的是0ms,只能说费马小定理+快速幂取模的确不错,但是数值达到一定数量级后会出现错误
注意,CPU是3210M,内存4G DDR3,过几天换12700+16G的试试







本帖子中包含更多资源

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

x

0

技术

1

魅力

0

原创

略知一二

Rank: 3Rank: 3

积分
902
人气
25
分享
0
发表于 2022-8-9 23:12:48 | 显示全部楼层
JimmyzZZ 发表于 2022-8-9 20:28
[mw_shl_code=cpp,true]#include
#include
using namespace std;

不太可能吧……0毫秒就算了出来?

他有计算这个过程就说明他需要时间,0ms有点不正常

1

技术

14

魅力

1

原创

退休版主

Rank: 8Rank: 8

积分
8180
人气
416
分享
59

论坛元老活跃会员灌水之王荣誉管理

 楼主| 发表于 2022-8-10 06:39:45 | 显示全部楼层
xiaomeng242 发表于 2022-8-9 23:12
不太可能吧……0毫秒就算了出来?

他有计算这个过程就说明他需要时间,0ms有点不正常 ...

我也也得很奇怪,肯定是精度不够了

0

技术

1

魅力

0

原创

略知一二

Rank: 3Rank: 3

积分
902
人气
25
分享
0
发表于 2022-8-10 08:06:33 | 显示全部楼层
JimmyzZZ 发表于 2022-8-10 06:39
我也也得很奇怪,肯定是精度不够了

感觉你时间算错了,凭借直觉

不过还是很羡慕学编译性语言的大佬

0

技术

1

魅力

0

原创

略知一二

Rank: 3Rank: 3

积分
902
人气
25
分享
0
发表于 2022-8-10 08:17:59 | 显示全部楼层
JimmyzZZ 发表于 2022-8-9 20:28
[mw_shl_code=cpp,true]#include
#include
using namespace std;

太逊了,python对时间可以精确到小数点后15位的



本帖子中包含更多资源

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

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

本版积分规则

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