鱼C论坛

 找回密码
 立即注册
楼主: 欧拉计划

题目7:找出第10001个质数

[复制链接]
发表于 2020-7-23 15:07:42 | 显示全部楼层
  1. """
  2. To find the nth prime
  3. """
  4. import math
  5. from math import sqrt, floor

  6. def is_prime(a):
  7.     if a == 2:
  8.         return True
  9.     for i in range(2, floor(sqrt(a))+1):
  10.         if a % i == 0:
  11.             return False
  12.     return True

  13. def getNthPrime(n):
  14.     x = 2
  15.     if n == 1:
  16.         return 2
  17.     if n == 2:
  18.         return 3
  19.     p = 3
  20.     while x < n:
  21.         p += 2
  22.         if is_prime(p):
  23.             x += 1
  24.     return p
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 14:26:14 | 显示全部楼层
  1. flag = 1
  2. a = 1
  3. b = 1
  4. while flag:
  5.     a += 2
  6.     c = 3
  7.     while c <= a ** 0.5 :
  8.         if a % c == 0:
  9.             break
  10.         c += 2
  11.     if c > a**0.5:
  12.         b += 1
  13.     if b == 10001:
  14.         flag = 0
  15. print(a)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 21:37:23 | 显示全部楼层
  1. from time import time
  2. from math import sqrt

  3. def prime(x):
  4.     if x <= 2:
  5.         print('error')
  6.     else:
  7.         if x%2 == 0:
  8.             return False
  9.         for i in range(3,int(sqrt(x))+1,2):
  10.             if  x%i == 0:
  11.                 return False
  12.         return x
  13.    
  14. t1 = time()      
  15. m = [2,3,5,7,11,13]
  16. i = 14
  17. while True:
  18.     if prime(i):
  19.         m.append(i)
  20.     if len(m) == 10001:
  21.         print(m[-1])
  22.         break
  23.     i += 1

  24. t2 = time()
  25. t=t2-t1
  26. print('耗时为:%s' % t)   
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-4 10:12:25 | 显示全部楼层
  1. '''前六个质数是 2, 3, 5, 7, 11 和 13,其中第 6 个是 13。
  2. 第 10001 个质数是多少?'''

  3. def numprime(position):
  4.     a = 8
  5.     prime_sequence = [2,3,5,7]
  6.     while len(prime_sequence) < position:
  7.         for prime in range(2,int(a/2)):
  8.             check = 0
  9.             if a%prime == 0:
  10.                 check += 1
  11.                 break
  12.         if check == 0:
  13.             prime_sequence.append(a)
  14.         a += 1
  15.     print("第%d个质数是: %d" %(position,prime_sequence[position-1]))

  16. start_numprime = time.time()
  17. numprime(10001)
  18. time_numprime = time.time() - start_numprime
  19. print("%f秒" %time_numprime)
复制代码



第10001个质数是: 104743
17.688404秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-5 11:46:33 | 显示全部楼层
本帖最后由 gonorth 于 2020-11-5 11:51 编辑

import math as m


def is_prime(n):
    if n > 1:
        if n == 2:
            return True
        if n % 2 == 0:
            return False
        for each in range(3, int(m.sqrt(n )) + 1, 2):
            if n % each == 0:
                return False
        return True
    return False


def get_prime(n):
    while 1:
        if is_prime(n):
            yield n
        n = n + 1


def solve():
    count = 0
    for i in get_prime(1):
        count = count + 1
        if count + 1> 10001:
            break
    return i


print(solve())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-6 15:38:51 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>

  3. main()
  4. {
  5.         int count = 0, num, i, j = 2, flag = 1;
  6.         while (1)
  7.         {
  8.                 for (i = 2; i < sqrt(j + 1); i++)
  9.                 {
  10.                         if (j % i == 0)
  11.                         {
  12.                                 flag = 0;
  13.                         }
  14.                 }
  15.                 if (flag == 1)
  16.                 {
  17.                         count++;
  18.                 }
  19.                 if (count == 10001)
  20.                 {
  21.                         printf("\n第100001个质数是:%d\n", j);
  22.                         break;
  23.                 }
  24.                 j++;
  25.                 flag = 1;
  26.         }
  27. }
复制代码

老师帮我看看效率怎样,基本秒出答案, 104743
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-7 22:54:21 From FishC Mobile | 显示全部楼层
a1351468657 发表于 2021-3-6 15:38
老师帮我看看效率怎样,基本秒出答案, 104743

如果没开优化, 第9行的判断条件会不断调用sqrt, 严重浪费性能。
质数筛法会比普通的判断质数快。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-5 15:51:26 | 显示全部楼层
  1. flag=True
  2. result=2
  3. time=2
  4. i=5
  5. while time<=10001:
  6.     for each in range (2,i//2+1):
  7.         if i % each == 0:
  8.             flag=0
  9.             i+=1
  10.             break
  11.     if flag:
  12.         result=i
  13.         time+=1
  14.         i+=1
  15.     else:
  16.         flag=1
  17. print(result)
复制代码

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

使用道具 举报

发表于 2021-8-9 00:45:26 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>

  3. int count = 0;

  4. int is_prime(int value)
  5. {
  6.         int i=2;
  7.         for(i;i<sqrt(value);i++)//改进1
  8.         {
  9.                 count += 1;
  10.                 if (i>3) i++; //改进2
  11.                 if (value % i == 0) return 0;
  12.         }
  13.         return 1;
  14. }

  15. int main(void)
  16. {
  17.         int flag = 1;
  18.         int i = 3;
  19.         while(1)
  20.         {
  21.                 if (is_prime(i)) flag += 1;
  22.                 if (flag >= 10001) break;
  23.                 i += 2;//改进3
  24.         }
  25.        
  26.         printf("result = %d\n", i);
  27.         printf("count = %d\n", count);//count = 1491484
  28.         return 0;
  29. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-7 22:03:09 | 显示全部楼层
#include <iostream>
using namespace std;
int main()
{
        int sum=0,i=2;
        for(;;i++)
        {
         for(int i1=2;i1<i;i1++)
         {
                 if(i%i1==0)
                         break;
                 if(i1==(i-1))
                         sum++;
         }
         if(sum==10001)
         {
                 cout<<i<<endl;
                 break;
         }
        }
        return 0;
}

\\C++写的答案:104759
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-9 13:21:23 | 显示全部楼层
#生成输入值范围内的素数(质数)返回列表
from math import *
#判断是否是素数
def is_prime(number):
    if number > 1:
        if number == 2:
            return True
        if number % 2 == 0:
            return False
        for a in range(3,int(sqrt(number) + 1),2):
            if number % a == 0:
                return False
        return True
    return False
#生成素数列表,得到num以内的素数(返回列表primelist)
primelist = []
num = 110000

while 1:
    for i in range(2, num + 1):
        if is_prime(i):
            primelist.append(i)
            if len(primelist) == 10000:
                break

   
    break



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

使用道具 举报

发表于 2021-10-27 14:26:50 | 显示全部楼层
  1. #include<stdio.h>

  2. int mian(void)
  3. {
  4.         int result,flag = 0 ,num = 6;
  5.        
  6.         for(int i = 13;;i++)
  7.         {
  8.                  for(int j = 2;j<(i/2);j++)
  9.                  (
  10.                         if(i / j == 0)
  11.                         {
  12.                                 flag = 1;
  13.                                 break;
  14.                         }
  15.                 )
  16.                
  17.                 if(flag == 1)
  18.                         flag = 0;
  19.                 else
  20.                 {
  21.                         num++;
  22.                         if(num == 10001)
  23.                         {
  24.                                 result = i;
  25.                                 break;
  26.                         }
  27.                 }
  28.         }
  29.        
  30.         printf("%d",result;
  31.        
  32.         return 0;
  33. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 12:13:09 | 显示全部楼层
本帖最后由 guosl 于 2022-1-2 12:17 编辑

这个题目的大多数解都是通过整除性质来判断一个整数是否是一个素数,但这会耗费大量的时间,在此我用了筛法,时间大大地缩短了。
  1. /*
  2. 答案:104743
  3. 耗时:0.0006446秒
  4. */
  5. #include <iostream>
  6. #include <cstring>
  7. using namespace std;

  8. const int N = 200004;

  9. char cp[N];

  10. int main(void)
  11. {
  12.   memset(cp + 2, 1, sizeof(char) * (N - 2));
  13.   for (int i = 2; i <= 447; ++i)
  14.   {
  15.     if (cp[i] == 0)
  16.       continue;
  17.     for (int j = i * i; j <= N - 4; j += i)
  18.       cp[j] = 0;
  19.   }
  20.   int nCount = 1;
  21.   for (int i = 3; i <= N - 4; i += 2)
  22.   {
  23.     if (cp[i] == 1)
  24.     {
  25.       ++nCount;
  26.       if (nCount == 10001)
  27.       {
  28.         cout << i << endl;
  29.         break;
  30.       }
  31.     }
  32.   }
  33.   return 0;
  34. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-28 20:45:14 | 显示全部楼层
本帖最后由 mathtimes 于 2022-2-12 11:38 编辑

2.1s
  1. prime = [2,3]
  2. i = 4
  3. while len(prime)<10001:
  4.     s = True
  5.     for j in prime:
  6.         if i%j == 0:
  7.             s = False
  8.             break
  9.     if s:
  10.         prime.append(i)
  11.     i = i + 1
  12. print(prime[-1])
复制代码


0.5s
  1. #include <stdio.h>
  2. #include <vector>
  3. using std::vector;
  4. int main()
  5. {
  6.     vector<long long> prime;
  7.     vector<long long>::iterator it;
  8.     long long i;   
  9.     prime.push_back(2);
  10.     for(i=2;i<__LONG_LONG_MAX__&&prime.size()<10001;i++)
  11.     {
  12.         for(it=prime.begin();it!=prime.end();it++)
  13.         {
  14.             if(i%*it==0)
  15.                 goto loop;
  16.         }
  17.         prime.push_back(i);  
  18.         loop:;
  19.     }         
  20.     printf("%lld",*(prime.end()-1));
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-22 17:03:20 | 显示全部楼层
结果104759
  1. #include <stdio.h>
  2. #define NUM 10001

  3. int main()
  4. {
  5.         int i,n=0,s=0,x=3;
  6.        
  7.         while(s<NUM)
  8.         {
  9.                 for(i=2;i<x;i++)
  10.                 {
  11.                         if(x%i==0){
  12.                                 n++;
  13.                                 x++;
  14.                                 break;
  15.                         }
  16.                 }
  17.                
  18.                 if(n==0){
  19.                         s++;
  20.                         x++;
  21.                         continue;
  22.                 }
  23.                
  24.                 n=0;
  25.         }
  26.         printf("%d",x-1);
  27.         return 0;
  28.        
  29. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-23 10:24:21 | 显示全部楼层
冗余设计用了长度1000000的列表,如果只考虑20万左右的列表,可以再缩小5倍的时间。
  1. package main

  2. import (
  3.         "fmt"
  4.         "time"
  5. )

  6. //题目6:
  7. //
  8. //前六个质数是 2, 3, 5, 7, 11 和 13,其中第 6 个是 13。
  9. //
  10. //第 10001 个质数是多少?
  11. func main() {
  12.         t := time.Now()
  13.         var nums [1000000]int
  14.         nums[0] = 1
  15.         nums[1] = 1

  16.         for i := 2; i < 1000; i++ {
  17.                 var j int
  18.                 for j = i * i; j < 1000000; j += i {
  19.                         nums[j] = 1
  20.                 }
  21.         }
  22.         var c int = 0
  23.         var count int = 0
  24.         for c = 2; c < 1000000; c++ {
  25.                 if nums[c] == 0 {
  26.                         count++
  27.                 }
  28.                 if count == 10001 {
  29.                         fmt.Println(c)
  30.                         break
  31.                 }
  32.         }
  33.         tt := time.Now()
  34.         fmt.Println("耗时:", (tt.Nanosecond()-t.Nanosecond())/1e6, "ms")
  35. }
复制代码

输出:
  1. C:\Users\Anaconda\GolandProjects\EulerProject\output\go_build_Euler06_go.exe
  2. 104743
  3. 耗时: 19 ms

  4. 进程 已完成,退出代码为 0
复制代码

Go语言还真是快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-7 21:52:42 | 显示全部楼层
本帖最后由 Asss-whom 于 2022-8-7 21:53 编辑

这种暴算的任务Rust + Rayon轻松解决:
(抄的RustCC的代码)
  1. use rayon::prelude::*;
  2. use std::time::Instant;

  3. const N: i32 = 200000;

  4. fn main() {
  5.     let now = Instant::now();
  6.     let mut primes = Vec::new();
  7.     let mut cur = 10;
  8.     // bootstrap
  9.     for i in 2..cur {
  10.         if primes.iter().all(|p| i % p != 0) {
  11.             primes.push(i);
  12.         }
  13.     }
  14.     while cur < N {
  15.         let next = std::cmp::min(cur * cur, N);
  16.         let mut addition: Vec<_> = (cur..next)
  17.             .into_par_iter()
  18.             .filter(|x| {
  19.                 for p in primes.iter() {
  20.                     if x % p == 0 {
  21.                         return false;
  22.                     }
  23.                     if x / p < *p {
  24.                         break;
  25.                     }
  26.                 }
  27.                 true
  28.             })
  29.             .collect();
  30.         primes.append(&mut addition);
  31.         cur = next;
  32.     }
  33.     println!("{}", primes[10001]);
  34.     println!("耗时{}毫秒。", now.elapsed().as_millis())
  35. }
复制代码

---
104759
耗时3毫秒。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-18 12:01:13 | 显示全部楼层
zxc123qwe 发表于 2016-4-26 13:04
这代码怎么弄上去的,还能粘贴复制显示行数。教教我吧

https://fishc.com.cn/thread-52272-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-6 22:40:59 | 显示全部楼层
  1. #include <stdio.h>

  2. int main() {
  3.         long long int i = 1, num = 0, j = 0;
  4.         while (num < 10001) {
  5.                 for ( j = 2; j < i; j++) {
  6.                         if (i % j == 0)
  7.                                 break;
  8.                 }
  9.                 if (j == i)
  10.                         num++;
  11.                 i++;
  12.         }

  13.         printf("%d", i - 1);
  14. }
复制代码

感觉写的一般,应该有更好的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 17:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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