鱼C论坛

 找回密码
 立即注册
查看: 3264|回复: 15

题目35:100万以下有多少个循环质数?

[复制链接]
发表于 2015-4-23 23:50:10 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 欧拉计划 于 2015-4-24 00:00 编辑
Circular primes

The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime.

There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.

How many circular primes are there below one million?

题目:

我们称 197 为一个循环质数,因为它的所有轮转形式: 197, 971 和 719 都是质数。

100 以下有 13 个这样的质数: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 和 97.

100 万以下有多少个循环质数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-9 23:05:18 | 显示全部楼层
本帖最后由 yundi 于 2016-7-9 23:12 编辑

算法不怎么好,仅仅是把题作出来了.耗时85535ms.
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <Windows.h>

  5. #define MAXN 1000000 //要修改栈默认大小
  6. struct node{
  7.         char str[5];
  8.         int fg;
  9.         struct node * pnext;
  10. } node ;
  11. typedef struct node Node,* PNode;

  12. PNode addnode(PNode * pphead , char * p)
  13. {
  14.         PNode pd;
  15.         if(* pphead == NULL)
  16.         {
  17.                 * pphead = (PNode)malloc(sizeof(Node));
  18.                 memset(* pphead,0,sizeof(Node));
  19.                 strcpy((* pphead)->str,p);
  20.                 (* pphead)->pnext = NULL;
  21.         }else{
  22.                 pd = * pphead;
  23.                 while(pd->pnext != NULL)
  24.                 {
  25.                         pd = pd->pnext;
  26.                 }
  27.                 pd->pnext = (PNode)malloc(sizeof(Node));
  28.                 memset(pd->pnext,0,sizeof(Node));
  29.                 strcpy(pd->pnext->str,p);
  30.                 pd->pnext->pnext = NULL;
  31.         }
  32.         return * pphead;
  33. }

  34. void printnode(PNode phead)
  35. {
  36.         PNode px=phead;
  37.         while(px!=NULL )
  38.         {
  39.                 if(px->fg != 0)
  40.                 {
  41.                         printf("%p:\t%s\t是循环质素\n",px,px->str);
  42.                 }               
  43.                 px = px->pnext;
  44.         }
  45. }

  46. int find(char * stmp,PNode phead)
  47. {
  48.         int slen = strlen(stmp);
  49.         int i;
  50.         int fg = 0;
  51.         PNode pd = phead;
  52.         char * p = (char *)malloc(sizeof(char)*(slen+1));
  53.         memset(p,0,sizeof(char)*(slen+1));
  54.         //stmp倒序
  55.         for(i=0;i<slen;i++)
  56.         {
  57.                 p[i] = stmp[slen - i - 1];
  58.         }
  59.         p[i] = '\0';
  60.         //在链表中比对
  61.         while(pd!=NULL && strlen(pd->str)<=slen)
  62.         {
  63.                 if(strcmp(p,pd->str)==0)
  64.                 {
  65.                         pd->fg = 1;
  66.                         fg = 1;
  67.                         break;
  68.                 }else{
  69.                         pd = pd->pnext;
  70.                 }
  71.         }
  72.         free(p);//用完释放
  73.         return fg;
  74. }
  75. int main()
  76. {
  77.         int num[MAXN],i,j,* pnum,* px;
  78.         PNode ph=NULL;
  79.         PNode pdx;
  80.         char stmp[5]={0};
  81.         int start,stop;

  82.         //1.num数组赋值1,2,3...
  83.         start = (int)GetTickCount();//计时
  84.         for(i=0;i<MAXN;i++)
  85.         {
  86.                 num[i] = i+1;               
  87.         }
  88.         //2.num数组中筛选出质数
  89.         pnum = num+1;
  90.         while(pnum <= num + MAXN)
  91.         {
  92.                 if(*pnum!=0)
  93.                 {
  94.                         px = pnum+(*pnum);
  95.                         while(px<=num+MAXN)
  96.                         {                               
  97.                                 * px = 0;
  98.                                 px += (*pnum);                               
  99.                         }
  100.                 }
  101.                 pnum ++;
  102.         }
  103.         //3.将质数转化为字符串,保存到链表
  104.         for(i=0;i<MAXN;i++)
  105.         {
  106.                 if(num[i]!=0 && num[i]!=1){
  107.                         //printf("%d,",num[i]);
  108.                         addnode(&ph,itoa(num[i],stmp,10));
  109.                 }
  110.         }
  111.         //4.在链表中筛选所需质数
  112.         pdx = ph;
  113.         while(pdx != NULL)
  114.         {
  115.                 if(find(pdx->str,ph) == 1)
  116.                 {
  117.                         pdx->fg = 1;
  118.                 }
  119.                 pdx = pdx->pnext;
  120.         }
  121.         stop = (int)GetTickCount();
  122.         //5.输出结果
  123.         printnode(ph);
  124.         printf("\n共历时 %d ms",stop-start);
  125.         //6.释放链表资源,略
  126.     getchar();
  127. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-2 23:34:29 | 显示全部楼层
  1. import math
  2. def prime(x):
  3.       if x > 1:
  4.             if x == 2:
  5.                   return True
  6.             if x % 2 == 0:
  7.                   return False
  8.             for i in range(3,int(math.sqrt(x))+1,2):
  9.                   if x % i==0:
  10.                         return False
  11.             return True
  12.       return False
  13. list2 = []
  14. for i in range(1,1000000):
  15.       if prime(i):
  16.             for j in range(len(str(i))):
  17.                   if len(str(i)) == 1:
  18.                         if i not in list2:
  19.                               list2.append(i)
  20.                   elif len(str(i)) == 2:
  21.                         list1 = []
  22.                         list1.append(i)
  23.                         Judge = True
  24.                         for n in range(len(str(i))-1):
  25.                               tmp = str(i)[-1] + str(i)[0]
  26.                               list1.append(int(tmp))
  27.                               i = int(tmp)
  28.                         for each in list1:
  29.                               if not prime(each):
  30.                                     Judge = False
  31.                                     break
  32.                         if Judge:
  33.                               if list1 not in list2:
  34.                                     list2.append(list1)
  35.                   elif len(str(i)) == 3:
  36.                         list1 = []
  37.                         list1.append(i)
  38.                         Judge = True
  39.                         for n in range(len(str(i))-1):
  40.                               tmp = str(i)[-1]+str(i)[0]+str(i)[1]
  41.                               list1.append(int(tmp))
  42.                               i = int(tmp)
  43.                         for each in list1:
  44.                               if not prime(each):
  45.                                     Judge = False
  46.                                     break
  47.                         if Judge:
  48.                               if list1 not in list2:
  49.                                     list2.append(list1)                  
  50.                   elif len(str(i)) == 4:
  51.                         list1 = []
  52.                         list1.append(i)
  53.                         Judge = True
  54.                         for n in range(len(str(i))-1):
  55.                               tmp = str(i)[-1]+str(i)[0]+str(i)[1]+str(i)[2]
  56.                               list1.append(int(tmp))
  57.                               i = int(tmp)
  58.                         for each in list1:
  59.                               if not prime(each):
  60.                                     Judge = False
  61.                                     break
  62.                         if Judge:
  63.                               if list1 not in list2:
  64.                                     list2.append(list1)
  65.                   elif len(str(i)) == 5:
  66.                         list1 = []
  67.                         list1.append(i)
  68.                         Judge = True
  69.                         for n in range(len(str(i))-1):
  70.                               tmp = str(i)[-1]+str(i)[0]+str(i)[1]+str(i)[2]+str(i)[3]
  71.                               list1.append(int(tmp))
  72.                               i = int(tmp)
  73.                         for each in list1:
  74.                               if not prime(each):
  75.                                     Judge = False
  76.                                     break
  77.                         if Judge:
  78.                               if list1 not in list2:
  79.                                     list2.append(list1)
  80.                   elif len(str(i)) == 6:
  81.                         list1 = []
  82.                         list1.append(i)
  83.                         Judge = True
  84.                         for n in range(len(str(i))-1):
  85.                               tmp = str(i)[-1]+str(i)[0]+str(i)[1]+str(i)[2]+str(i)[3]+str(i)[4]
  86.                               list1.append(int(tmp))
  87.                               i = int(tmp)
  88.                         for each in list1:
  89.                               if not prime(each):
  90.                                     Judge = False
  91.                                     break
  92.                         if Judge:
  93.                               if list1 not in list2:
  94.                                     list2.append(list1)
  95. list3 = []
  96. for each in list2:
  97.       if type(each) == list:
  98.             for i in each:
  99.                   if i not in list3:
  100.                        list3.append(i)
  101.       else:
  102.             if each not in list3:
  103.                   list3.append(each)
  104. print(len(list3))
复制代码

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

使用道具 举报

发表于 2016-10-26 23:39:09 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:35 编辑
  1. import math
  2. def zhuanhuan(num):
  3.     list1 = []
  4.     count = len(str(num))
  5.     str1 = str(num)
  6.     while count:
  7.         list1.append(int(str1[1:] + str1[0]))
  8.         str1 = str1[1:] + str1[0]
  9.         count -= 1
  10.     return list1

  11. def isZhishu(num):
  12.     for i in range(2, int(math.sqrt(num))+1):
  13.         if num % i == 0:
  14.             #print num, i, num/i
  15.             return False
  16.     else:
  17.         return True


  18. def zhishu(num):
  19.     list = []
  20.     for i in range(2, num):
  21.         for j in range(2, int(math.sqrt(i))+1):
  22.             if i % j == 0:
  23.                 break
  24.         else:
  25.             list.append(i)
  26.     return list
  27. def xunhuanzhishu(num):
  28.     listNum = []
  29.     for i in zhishu(num):
  30.         for j in zhuanhuan(i):
  31.             if not isZhishu(j):
  32.                 break
  33.         else:
  34.             listNum.append(i)
  35.     return listNum


  36. print xunhuanzhishu(1000000)
  37. print len(xunhuanzhishu(1000000))
复制代码



[2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97, 113, 131, 197, 199, 311, 337, 373, 719, 733, 919, 971, 991, 1193, 1931, 3119, 3779, 7793, 7937, 9311, 9377, 11939, 19391, 19937, 37199, 39119, 71993, 91193, 93719, 93911, 99371, 193939, 199933, 319993, 331999, 391939, 393919, 919393, 933199, 939193, 939391, 993319, 999331]
55

不知道答案对不对,求真相
耗时大概10s,求优化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-27 22:18:59 | 显示全部楼层
376103327 发表于 2016-10-26 23:39
import math
def zhuanhuan(num):
    list1 = []

优化了一下算法
55
[Finished in 0.9s]
  1. import math
  2. def getprime(n):
  3.         primes = [True]*n
  4.         primes[0], primes[1] = False,False
  5.         for (i, prime) in enumerate(primes):
  6.                 if prime:
  7.                         for j in range(i*i,n,i):
  8.                                 primes[j] = False
  9.         plist = []
  10.         for (k, trueprime) in enumerate(primes):
  11.                 if trueprime:
  12.                         plist.append(k)
  13.         return plist

  14. def iscycle(n):
  15.         l = int(math.log10(n))
  16.         for i in range(l):
  17.                 n = (n%10)*(10**l)+n//10
  18.                 if isprime(n) == False:
  19.                         return False
  20.         return True

  21. def isprime(n):
  22.         for e in primelist:
  23.                 if n%e == 0:
  24.                         return False
  25.                 if e*e>n:
  26.                         break
  27.         return True

  28. primelist = getprime(1000000)
  29. count = 0
  30. for each in primelist:
  31.         if iscycle(each):
  32.                 count += 1
  33. print (count)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-14 00:00:58 | 显示全部楼层
  1. # encoding:utf-8
  2. # 寻找100万以下的循环质数
  3. from time import time
  4. def getPrimes(N=1000000):
  5.     l_result = [True] * N
  6.     l_result[0], l_result[1] = False, False
  7.     for i in range(0, N):
  8.         if l_result[i]:
  9.             for j in range(i * i, N, i):
  10.                 l_result[j] = False
  11.     return l_result
  12. def euler034(N=1000000):
  13.     l_primes = getPrimes(N)
  14.     l_k = [k for (k, v) in enumerate(l_primes) if v]
  15.     l_result = []
  16.     for each in l_k:
  17.         if each in l_result:
  18.             continue
  19.         tmp = str(each)
  20.         if len(tmp) == 1:
  21.             l_result.append(each)
  22.             continue
  23.         else:
  24.             flag = True
  25.             l_tmp = []
  26.             for i in range(1, len(tmp)):
  27.                 tmp = tmp[1:] + tmp[0]
  28.                 if not l_primes[int(tmp)]:
  29.                     flag = False
  30.                     break
  31.                 else:
  32.                     l_tmp.append(int(tmp))
  33.             if flag:        
  34.                 l_result.append(each)
  35.                 l_result.extend(l_tmp)
  36.     l_result = list(set(l_result))
  37.     l_result.sort()
  38.     print(l_result)
  39.     print(len(l_result))
  40. if __name__ == '__main__':
  41.     start = time()
  42.     euler034(1000000)
  43.     print('cost %.6f sec' % (time() - start))
复制代码

[2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97, 113, 131, 197, 199, 311, 337, 373, 719, 733, 919, 971, 991, 1193, 1931, 3119, 3779, 7793, 7937, 9311, 9377, 11939, 19391, 19937, 37199, 39119, 71993, 91193, 93719, 93911, 99371, 193939, 199933, 319993, 331999, 391939, 393919, 919393, 933199, 939193, 939391, 993319, 999331]
55
cost 0.532378 sec
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-14 21:34:05 | 显示全部楼层
本帖最后由 渡风 于 2017-6-14 21:42 编辑

此代码使用matlab编程
Problem35所用时间为: 44.836秒
Problem35的答案为: 55
  1. %% Problem35.m
  2. % 最后编辑时间:17-06-14 22:00
  3. % 找出100w以下的循环质数
  4. % Problem35所用时间为: 44.836秒
  5. % Problem35的答案为: 55
  6. function Output = Problem35()
  7. tic
  8. Limit = 1000000;
  9. Vector = GetPrime(Limit);
  10. N = length(Vector);

  11. Output = 0;

  12. for ii = 1:N  
  13.     if  Iscycle(Vector(ii)) == 1
  14.         Output = Output + 1;
  15.         disp(Vector(ii))
  16.     end
  17. end

  18. toc
  19. disp('此代码使用matlab编程')
  20. disp(['Problem35所用时间为: ',num2str(toc),'秒'])
  21. disp(['Problem35的答案为: ',num2str(Output)])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-18 09:57:21 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:35 编辑
  1. import numpy as np
  2. import time

  3. stime = time.time()

  4. def prime(n):
  5.     if n <= 1:
  6.       return False
  7.     for i in range(2, int(np.sqrt(n)) + 1):
  8.         if n % i == 0:
  9.             return False
  10.     return True

  11. def prod_digit(x):
  12.     result = []
  13.     p = str(x)
  14.     count = len(p)
  15.     str1 = str(x)
  16.     while count:
  17.         result.append(int(p[1:]+p[0]))
  18.         p = p[1:] + p[0]
  19.         count -= 1
  20.     return result

  21. result = []
  22. temp = []
  23. for i in range(0, 1000000):
  24.     if prime(i):
  25.         a = prod_digit(i)
  26.         for item in a:
  27.             temp.append(prime(item))
  28.         if False not in temp:
  29.             result.append(i)
  30.         temp = []
  31. print(len(result))

  32. end = time.time()

  33. print(end - stime)
复制代码


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

使用道具 举报

发表于 2018-11-6 05:04:54 | 显示全部楼层
  1. import math
  2. import itertools
  3. from time import time

  4. lst1 = [2,3]
  5. lst4 = [2,3]
  6. lst_t = []
  7. lst_f = []

  8. def zhi1(n):
  9.     if n%2 == 0: return False
  10.     else:
  11.         for i in lst1:
  12.             if i > math.sqrt(n):
  13.                 break
  14.             if n%i == 0:
  15.                 return False
  16.         if n <1000:
  17.             lst1.append(n)
  18.         return True

  19. def zhi2(n):

  20.     if n%2 == 0: return False
  21.     else:
  22.         for i in lst1:
  23.             if i > math.sqrt(n):
  24.                 break
  25.             if n%i == 0:
  26.                 return False
  27.         return True

  28. for i in range(5,1000):
  29.     zhi1(i)
  30.    
  31. def text(a):
  32.     while a<1000000:
  33.         if zhi2(a):
  34.             yield a
  35.         a += 2

  36. def pailie(number):
  37.     lst2 = []
  38.     while number:
  39.         if number < 10:
  40.             lst2.insert(0,number)
  41.         else:
  42.             s = number%10
  43.             lst2.insert(0,s)
  44.         number //= 10
  45.     return lst2

  46. def ite(lst2):
  47.     lst3 = set()
  48.     for k in lst2:
  49.         if k%2 == 0:
  50.             return False
  51.     for i in range(len(lst2)):
  52.         temp = lst2[i+1:]+lst2[:i+1]
  53.         m = ''
  54.         for j in temp:
  55.             m += str(j)
  56.         lst3.add(int(m))
  57.     return list(lst3)

  58. def shengcheng():
  59.     a = 0
  60.     final = set()
  61.     for i in text(5):
  62.         if i:
  63.             itr = ite(pailie(i))
  64.             if itr:
  65.                 F,T = True,False
  66.                 for j in itr:
  67.                     if lst_f != [] and j == lst_f[0]:
  68.                         lst_f.pop(0)
  69.                         T = True
  70.                     elif lst_t != [] and j == lst_t[0]:
  71.                         a += 1
  72.                         lst_t.pop(0)
  73.                         final.add(i)
  74.                         T = True
  75.                 if T:
  76.                     continue
  77.                 lst_m = []
  78.                 for j in itr:
  79.                     if zhi2(j):
  80.                         lst_m.append(j)
  81.                     else:
  82.                         F = False
  83.                 if not F:
  84.                     for j in lst_m:
  85.                         if j > i:
  86.                             lst_f.append(j)
  87.                 if F:
  88.                     final.add(i)
  89.                     a += 1
  90.                     for j in lst_m:
  91.                         if j > i:
  92.                             lst_t.append(j)
  93.                 lst_f.sort()
  94.                 lst_t.sort()
  95.     print(len(final))

  96. start = time()
  97. shengcheng()
  98. print('消耗%.2f'%(time()-start))
  99. ##print(lst_t)
  100. ##print(lst_f)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-13 16:13:18 | 显示全部楼层
本帖最后由 王小召 于 2019-6-13 16:28 编辑

共有循环质数:55个
分别是:[2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97, 113, 131, 197, 199, 311, 337, 373, 719, 733, 919, 971, 991, 1193, 1931, 3119, 3779, 7793, 7937, 9311, 9377, 11939, 19391, 19937, 37199, 39119, 71993, 91193, 93719, 93911, 99371, 193939, 199933, 319993, 331999, 391939, 393919, 919393, 933199, 939193, 939391, 993319, 999331]
用时:6.3180404999999995 秒
  1. import time

  2. def prime_list(num_range):
  3.     bool_num = [1] * (num_range+1)
  4.     bool_num[0] = 0
  5.     bool_num[1] = 0
  6.     for i,j in enumerate(bool_num):
  7.         if j:
  8.             for x in range(i**2, num_range+1, i):
  9.                 bool_num[x] = 0
  10.     return bool_num

  11. def cal_result(X_range):
  12.     bool_nums = prime_list(X_range)
  13.     result = []
  14.     for num in range(2, X_range):
  15.         if num in result:
  16.             continue
  17.         else:
  18.             mark = 1
  19.             for each_value in [str(num)[i:] + str(num)[:i] for i in range(len(str(num)))]:
  20.                 if not bool_nums[int("".join(each_value))]:
  21.                     mark = 0
  22.                     break
  23.             if mark == 1:
  24.                 for each in [str(num)[i:] + str(num)[:i] for i in range(len(str(num)))]:
  25.                     result.append(int(each))
  26.     return list(set(result))

  27. result = cal_result(1000000)
  28. result.sort()
  29. print("共有循环质数:{}个\n分别是:{}\n用时:{} 秒".format(len(result), result, time.process_time()))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-5 18:01:23 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-6 09:30 编辑
  1. def func(num):
  2.   num=str(num)
  3.   
  4.   for i in range(len(num)-1):
  5.     num=num[1:]+num[0]
  6.    
  7.     if int(num)not in primeset:
  8.         return False
  9.    
  10.   return True


  11. def findprimes(end):
  12.   primelist=[True]*(end+1)
  13.   primelist[0]=primelist[1]=False
  14.   
  15.   for i,prime in enumerate(primelist[:int(end/2+1)]):
  16.     if prime:
  17.       for j in range(2*i,end+1,i):primelist[j]=False
  18.       
  19.   return{i for i,prime in enumerate(primelist)if prime}


  20. primeset=findprimes(1000000)
  21. print(sum(func(i) for i in primeset))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 20:13:26 | 显示全部楼层
55

Process returned 0 (0x0)   execution time : 0.828 s
Press any key to continue.
使用STL容器deque,欧拉筛打表,注意到数字不能出现0
  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<deque>
  5. using namespace std;

  6. const int M = 1e6;
  7. int cnt = 0;
  8. bool prime[M];
  9. int factor[M];

  10. void euler_sieve(){
  11.   prime[1] = false;
  12.   for (int i = 2;i <= M;i++) prime[i] = true;

  13.   for (int i = 2;i <= M;i++){
  14.     if (prime[i]) factor[++cnt] = i;
  15.     for (int j = 1;j <= cnt && i*factor[j] < M;j++){
  16.       prime[i*factor[j]] = false;
  17.       if (i % factor[j] == 0) break;
  18.     }
  19.   }
  20. }

  21. bool isprime(int x){
  22.   x = abs(x);
  23.   if (x == 0 || x == 1) return false;
  24.   for (int i = 1;factor[i] <= sqrt(x);i++)
  25.     if (x % factor[i] == 0)  return false;
  26.   return true;
  27. }

  28. deque<int> dq;
  29. int n;

  30. bool has_zero(){
  31.   for (int i = 0;i < dq.size();i++)
  32.     if (dq[i] == 0) return true;
  33.   return false;
  34. }

  35. bool cir_prime(int x){
  36.   if (!isprime(x))  return false;
  37.   dq.clear();

  38.   while(x){
  39.     dq.push_front(x % 10);
  40.     x /= 10;
  41.   }
  42.   if (has_zero()) return false;
  43.   dq.push_back(dq.front());
  44.   dq.pop_front();

  45.   int t = 0;
  46.   for (int i = 0;i < dq.size();i++)
  47.     t = t * 10 + dq[i];
  48.   //cout << t << endl;
  49.   if (t == n) return true;
  50.   return cir_prime(t);
  51. }

  52. int main(){
  53.   euler_sieve();
  54.   int cnt = 1;//把2先算上

  55.   for (n = 3;n < M;n+=2){
  56.     dq.clear();
  57.     if (cir_prime(n)) cnt++;
  58.   }
  59.   cout << cnt << endl;
  60.   return 0;
  61. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 17:46:25 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>

  4. int tran(int);
  5. int check_num(int);

  6. int tran(int num)
  7. {
  8.         char str[10];
  9.         int i, j, k;
  10.         k = num;
  11.         j = k % 10;
  12.         k /= 10;
  13.        
  14.         sprintf(str, "%d", k);
  15.         i = strlen(str);

  16.         k += j * pow(10, i);
  17.         return k;
  18. }

  19. int check_num(int num)
  20. {
  21.         int i, j, k;
  22.         k = num;
  23.         j = sqrt(num + 1);
  24.         for (i = 2; i <= j; i++)
  25.         {
  26.                 if (k % i == 0)
  27.                 {
  28.                         return 0;
  29.                 }
  30.         }
  31.         return 1;
  32. }

  33. main()
  34. {
  35.         char str[32];
  36.         int i, j, len, flag = 1;
  37.         int count = 13; //100以下有13个质数

  38.         for (i = 100; i < 1000000; i++)
  39.         {
  40.                 sprintf(str, "%d", i);
  41.                 len = strlen(str);
  42.                 j = i;
  43.                 while (len)
  44.                 {
  45.                         if (check_num(j))
  46.                         {
  47.                                 j = tran(j);
  48.                         }
  49.                         else
  50.                         {
  51.                                 flag = 0;
  52.                                 break;
  53.                         }
  54.                         len--;
  55.                 }
  56.                 if (flag)
  57.                 {
  58.                         printf("%d ", i);
  59.                         count++;
  60.                 }
  61.                 flag = 1;
  62.         }
  63.         printf("\n%d\n", count);
  64. }
复制代码


100万以内一共有55个循环质数
113 131 197 199 311 337 373 719 733 919 971 991 1193 1931 3119 3779 7793 7937 9311 9377 11939 19391 19937 37199 39119 71993 91193 93719 93911 99371 193939 199933 319993 331999 391939 393919 919393 933199 939193 939391 993319 999331
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-3 15:56:53 | 显示全部楼层
  1. /*
  2. 答案:55
  3. 耗时:0.002754秒
  4. */
  5. #include <cstdio>
  6. #include <cstring>
  7. using namespace std;

  8. char cPrimes[1000000];//素数表

  9. int main(void)
  10. {
  11.   //筛法计算素数表
  12.   memset(cPrimes, 1, sizeof(cPrimes));
  13.   cPrimes[0] = 0;
  14.   cPrimes[1] = 0;
  15.   for (int i = 2; i < 1000; ++i)
  16.   {
  17.     if (cPrimes[i] == 0)
  18.       continue;
  19.     for (int j = i * i; j < 1000000; j += i)
  20.       cPrimes[j] = 0;
  21.   }
  22.   int nCount = 0;
  23.   for (int i = 2; i < 1000000; ++i)//穷举各数
  24.   {
  25.     if (cPrimes[i] == 0)
  26.       continue;
  27.     int p = i, nLen = 0;
  28.     while (p > 0) //计算这个数的位数
  29.     {
  30.       ++nLen;
  31.       p /= 10;
  32.     }
  33.     p = 1;
  34.     for (int k = 1; k < nLen; ++k)//计算循环中用到的10^(nLen-1)
  35.       p *= 10;
  36.     int j = i;//记录循环数
  37.     bool bFind = true;
  38.     for (int k = 1; k < nLen; ++k)//枚举循环数
  39.     {
  40.       j = j / 10 + (j % 10) * p;//计算循环后的数
  41.       if (cPrimes[j] == 0)//检查是否是素数
  42.       {
  43.         bFind = false;
  44.         break;
  45.       }
  46.     }
  47.     if (bFind)
  48.       ++nCount;//满足要求
  49.   }
  50.   printf("%d\n", nCount);
  51.   return 0;
  52. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-13 23:29:47 | 显示全部楼层
  1. #include <vector>
  2. #include <cmath>
  3. #include <iostream>
  4. using namespace std;
  5. bool similar(int x,int y,int len)
  6. {
  7.     if(len==1)
  8.         return false;
  9.     char bits1[len]{0};
  10.     char bits2[len]{0};
  11.     int i = 0;
  12.     while(x>0)
  13.     {
  14.         bits1[i++] = x%10;
  15.         x /= 10;
  16.     }
  17.     i = 0;
  18.     while(y>0)
  19.     {
  20.         bits2[i++] = y%10;
  21.         y /= 10;
  22.     }
  23.     i = 0;
  24.     while(++i<len)
  25.     {
  26.         for(int j=0;j<len-1;j++)
  27.             swap(bits1[j],bits1[j+1]);
  28.         for(int j=0;j<len;j++)
  29.             if(bits1[j]!=bits2[j])
  30.                 goto continuetodo;
  31.         return true;
  32.         continuetodo:;
  33.     }
  34.     return false;
  35. }
  36. int main()
  37. {
  38.     vector<int> prime,count;
  39.     prime.reserve(73000);
  40.     count.reserve(73000);
  41.     prime.push_back(2);
  42.     count.push_back(1);
  43.     int i = 3;
  44.     while(i<(int)1e6)
  45.     {
  46.         bool s = true;
  47.         for(auto j=prime.begin();*j<=sqrt(i)&&j!=prime.end();j++)
  48.             if(i%*j==0)
  49.             {   
  50.                 s = false;
  51.                 break;
  52.             }
  53.         if(s)
  54.         {
  55.             prime.push_back(i);
  56.             count.push_back(1);
  57.             int t = prime.size()-1;
  58.             int len = (int)log10(prime[t]);
  59.             if(similar(i,i,len+1))
  60.                 count.back() = -1;
  61.             int floornum = pow(10,len);
  62.             while(prime[--t]>floornum)
  63.                 if(similar(i,prime[t],len+1))
  64.                 {
  65.                     count.back() += count[t];
  66.                     break;
  67.                 }
  68.         }
  69.         i += 2;
  70.     }
  71.     i = prime.size();
  72.     int sum = 0;
  73.     for(int j=0;j<i;j++)
  74.     {
  75.         if(count[j]==-1)
  76.             sum ++;
  77.         if(count[j]==(int)log10(prime[j])+1)
  78.             sum += count[j];
  79.     }
  80.     cout<<sum;
  81. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-20 13:44:56 | 显示全部楼层
一开始看成全排列了,真的难顶啊
[2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97, 113, 131, 197, 199, 311, 337, 373, 719, 733, 919, 971, 991, 1193, 1931, 3119, 3779, 7793, 7937, 9311, 9377, 11939, 19391, 19937, 37199, 39119, 71993, 91193, 93719, 93911, 99371, 193939, 199933, 319993, 331999, 391939, 393919, 919393, 933199, 939193, 939391, 993319, 999331]
55
Time:2.2769715785980225s
  1. import time
  2. st=time.time()
  3. nn=6
  4. n=10**nn
  5. aa=[]
  6. a=0
  7. data=list(range(n+1))
  8. for i in range(int(n**0.5)+1):
  9.     if i<=1:
  10.         data[i]=0
  11.         continue
  12.     num=2
  13.     while i*num<=n:
  14.         data[i*num]=0
  15.         num=num+1
  16. # print(data[:20:])
  17. for k in data:
  18.     if k==0:
  19.         continue
  20.     ii=k
  21.     l=[]
  22.     while ii>0:
  23.         l.append(ii%10)
  24.         ii=ii//10
  25.     for i in range(len(l)):
  26.         num=0
  27.         for j in range(len(l)-1,-1,-1):
  28.             num=num*10+l[(i+j)%len(l)]
  29.         if data[num]==0:
  30.             break
  31.     if not data[num]==0:
  32.         aa.append(k)
  33.         a=a+1
  34.    
  35. print(aa)
  36. print(a)
  37. print('Time:{}s'.format(time.time()-st))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 16:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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