Backdoor CTF 2013: 杂项 75-----定时求随机个素数之和

来源:互联网 发布:java 抓取网页内容 编辑:程序博客网 时间:2024/06/15 06:42

题目

打开传送门之后,题目要求在3秒内提交前N(随机个)素数的和。

re.findall(pattern, string):详细看

搜索string,以列表形式返回全部能匹配的子串。

r(raw)用在pattern之前,表示单引号中的字符串为原生字符,不会进行任何转义

+加号,指定将前面的RE重复1次或者任意多次,而且总是试图尽量多次地匹配。

re.findall(r'[a-z]+','liuyaN1234ab9') #返回['liuya', 'ab']


本题的思路:

1.首先生成质数列表:
2.然后是读取素数表计算前N个素数的和并提交结果:

import requestsimport reimport math def prime_generate(n):    result = list()    result.append(2)    result.append(3)    for i in xrange(5,n+1,2):        for j in xrange(3,int(math.sqrt(i))+1):            if i%j == 0:                break        else:            result.append(i)    return result def calc_sum(num):    finsum=0    for x in prime_generate(10000)[:num]:        finsum=finsum+x    return finsum   def main():    url = "http://hack.bckdr.in/2013-MISC-75/misc75.php"    req = requests.get(url)    tmpcookies = req.cookies    # Set random N.    match = re.findall(r'[0-9]+', req.text); num = int(match[1])    sum=calc_sum(num)    data = {"answer": sum}    req2 = requests.post(url, data=data, cookies=tmpcookies)    print(req2.text) if __name__ == "__main__":    main()


如果想更快我觉得可以用筛选法:

我做了一个比较:

1.从奇数里挑素数+直到开根号(N)

#include<iostream>  #include<cmath>using namespace std;    int prime_table(int N )  {int i = 0, j = 0 , count = 0;      int *prime = new int[N + 1];      if (NULL == prime)          return -1;     prime[2] = 1;     for (i = 3; i <= N; i+=2)       {          prime[i] = 1;      }    for (i = 3; i <= N; i+=2)     {                  for (j = 3; j <= sqrt(i); j++)            {          if (i%j == 0)        {          prime[i] = 0;           count++;    break;        }         count++;                     }      }           cout << "Times of calculation : " <<  count << "\n";      for (i = 2; i <= N; i++)       {          if (prime[i] == 1)           {              cout << "\t" << i;                  if(j++ % 10 == 0)              {                  cout << '\n';              }          }      }  delete [] prime;      return 0; }int main()  {      int n;  cin >> n;          prime_table(n);          cout << "\n";      return 0;  }  


2.筛选发

#include<iostream>  using namespace std;    int prime_table(int N )  {      int i = 0, j = 0 , count = 0;      int *prime = new int[N + 1];      if (NULL == prime)          return -1;        for (i = 2; i <= N; i++)       {          prime[i] = 1;      }        for (i = 2; i * i <= N; i++)       {          if (prime[i] == 0)           {              count++;              continue;          }          for (j = i * i; j <= N; j = j + i)           {              prime[j] = 0;              count++;          }      }      cout << "Times of calculation : " <<  count << "\n";      for (i = 2; i <= N; i++)       {          if (prime[i] == 1)           {              cout << "\t" << i;                  if(j++ % 10 == 0)              {                  cout << '\n';              }          }      }      delete [] prime;      return 0;  }    int main()  {      int n;  cin >> n;          prime_table(n);          cout << "\n";      return 0;  }  





参考1

参考2