鱼C论坛

 找回密码
 立即注册
查看: 2770|回复: 17

题目37:找出所有11个可以双向裁剪的质数的和

[复制链接]
发表于 2015-4-24 00:37:49 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 永恒的蓝色梦想 于 2020-6-16 12:30 编辑
Truncatable primes

The number 3797 has an interesting property. Being prime itself, it is possible to continuously remove digits from left to right, and remain prime at each stage: 3797, 797, 97, and 7. Similarly we can work from right to left: 3797, 379, 37, and 3.

Find the sum of the only eleven primes that are both truncatable from left to right and right to left.

NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes.

题目:

3797 这个数很有趣。它本身是质数,而且如果我们从左边不断地裁去数字,得到的仍然都是质数:3797, 797, 97, 7。而且我们还可以从右向左裁剪:3797, 379, 37, 3,得到的仍然都是质数。

找出全部 11 个这样从左向右和从右向左都可以裁剪的质数的和。

注意:2, 3, 5 和 7 不被认为是可裁剪的质数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-30 12:08:56 | 显示全部楼层
3
5
7
31
37
53
59
71
73
79
311
313
317
373
379
593
599
719
733
739
797
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
请按任意键继续. . .
  1. #include <iostream>
  2. using namespace std;
  3. bool iszhishu(int n)
  4. {
  5.         if(1==n || 2==n)
  6.                 return false;
  7.         for (int z = 2;z*z<=n;z++)
  8.         {
  9.                 if(n%z==0)
  10.                         return false;
  11.                
  12.         }
  13.         return true;
  14. }
  15. bool is(int n)
  16. {
  17.         /* 从又开始裁剪 */
  18.         int h=0;
  19.         int k = n;
  20.         if(!iszhishu(n)) return false;
  21.         while ( k )
  22.         {
  23.                 k/=10; //裁剪
  24.                 if( iszhishu(k) )
  25.                         continue;
  26.                 else return false;

  27.                 h++;
  28.         }
  29.         /* 从左开始裁剪 */
  30.         k=n;
  31.         int i = 1;
  32.         while ( h )
  33.         {
  34.                 //不是质数
  35.                 if(!iszhishu(n%(int)pow(10,i++)))
  36.                         return false;
  37.                
  38.                 h--;
  39.         }
  40.         return true;
  41. }
  42. int main(void)
  43. {
  44.         for (int n = 2;n<=10000;n++)
  45.         {
  46.                 if(is(n))
  47.                 {
  48.                         std::cout<<n<<endl;
  49.                 }
  50.         }
  51.         return 0;
  52. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-6 11:03:25 | 显示全部楼层
  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. list3 = []
  15. for i in range(100000):
  16.       if prime(i):
  17.             if len(str(i)) > 1:
  18.                   temp = True
  19.                   list1 = []
  20.                   for j in range(len(str(i))-1):
  21.                         list1.append(str(i)[j+1:])
  22.                   for each in list1:
  23.                         if not prime(int(each)):
  24.                               temp = False
  25.                               break
  26.                   if temp:
  27.                         list2.append(i)
  28.                   for each in list2:
  29.                         tmp = True
  30.                         for n in range(len(str(each))):
  31.                               if not prime(int(str(each)[0:n+1])):
  32.                                     tmp = False
  33.                                     break
  34.                         if tmp :
  35.                               if each not in list3:
  36.                                     list3.append(each)
  37.                               
  38.                   
  39. print(list3)
复制代码

跑到10W就找到10个
[23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-14 13:53:27 | 显示全部楼层
  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 [k for (k, v) in enumerate(l_result) if v]
  12. def euler037():
  13.     l_primes = getPrimes()
  14.     l_result = []
  15.     for each in l_primes:
  16.         if len(str(each)) >= 2:
  17.             if str(each)[0] in ('4', '6', '8', '9'):
  18.                 continue
  19.             if (str(each)[::-1])[0] in ('6', '9'):
  20.                 continue
  21.             flag = True
  22.             for i in range(1, len(str(each))):
  23.                 t1 = each % 10 ** i
  24.                 t2 = each // 10 ** i
  25.                 if not(t1 in l_primes) or not(t2 in l_primes):
  26.                     flag = False
  27.                     break
  28.             if flag:
  29.                 l_result.append(each)
  30.                 print(l_result)
  31.         if len(l_result) == 11:
  32.             break
  33. def euler037_1():
  34.     l_primes = getPrimes()
  35.     l_result = []
  36.     for each in l_primes:
  37.         tmp = str(each)
  38.         if len(tmp) >= 2:
  39.             if tmp.startswith('4') or tmp.startswith('6') or tmp.startswith('8') or tmp.startswith('9') or tmp.endswith('6') or tmp.endswith('9'):
  40.                 continue
  41.             flag = True
  42.             for i in range(1, len(tmp)):
  43.                 t1 = tmp[i:]
  44.                 t2 = tmp[:len(tmp) - i]
  45.                 if not(int(t1) in l_primes) or not(int(t2) in l_primes):
  46.                     flag = False
  47.                     break
  48.             if flag:
  49.                 l_result.append(each)
  50.         if len(l_result) == 11:
  51.             print(l_result)
  52.             break               
  53.                

  54. if __name__ == '__main__':
  55.     start = time()
  56.     euler037_1()
  57.     print('cost %.6f sec' % (time() - start))
复制代码



[23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797, 739397]
效率比较低,要30-40s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-19 10:02:15 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:36 编辑
  1. from math import sqrt

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

  9. def right_number(n):
  10.        list1=[]
  11.        n=str(n)
  12.        for i in range(len(n)):
  13.               list1.append(n[i:])
  14.        return list1

  15. def left_number(n):
  16.        list1=[]
  17.        n=str(n)
  18.        for i in range(1,len(n)):
  19.               list1.append(n[-(len(n)):-i])
  20.        return list1

  21. number=9
  22. count=1
  23. list2=[]
  24. while count<=11:
  25.        if is_prime(number):
  26.               Judge=True
  27.               right_n=right_number(number)
  28.               left_n=left_number(number)
  29.               for n in right_n:
  30.                      if not is_prime(int(n)):
  31.                             Judge=False
  32.                             break

  33.               for n in left_n:
  34.                      if not is_prime(int(n)):
  35.                             Judge=False
  36.                             break
  37.               if Judge:
  38.                      list2.append(number)
  39.                      #print(number)
  40.                      count+=1
  41.        number+=1
  42.                      
  43. print(sum(list2))
复制代码




[23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797, 739397]
748317
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-14 22:51:23 | 显示全部楼层
此代码使用matlab编程
Problem37所用时间为: 14.9352秒
Problem37的答案为: 748317
  1. %% Problem37.m
  2. % 最后编辑时间:17-06-14 22:34
  3. % 找出11个双向裁剪质数的和
  4. % Problem37所用时间为: 14.9352秒
  5. % Problem37的答案为: 748317
  6. function Output = Problem37()
  7. tic
  8. Limit = 1000000;
  9. Vector = GetPrime(Limit);
  10. Vector = Vector(5:end);
  11. N = length(Vector);

  12. Output = 0;

  13. Time = 0;

  14. for ii = 1:N
  15.     Judge = 1;
  16.     L = length(num2str(Vector(ii)));
  17.     for jj = 1:L-1
  18.         if isprime(floor(Vector(ii)/(10^jj))) == 0
  19.             Judge = 0;
  20.             break
  21.         end
  22.     end
  23.    
  24.     if Judge == 1
  25.         Str = num2str(Vector(ii));
  26.         for jj = 2:L
  27.             if isprime(str2double(Str(jj:L))) == 0
  28.                Judge = 0;
  29.                break
  30.             end
  31.         end
  32.     end
  33.    
  34.     if Judge == 1
  35.         Output = Output + Vector(ii);
  36.         Time = Time + 1;
  37.         disp(Vector(ii))
  38.         if Time == 11
  39.             break
  40.         end        
  41.     end
  42.          
  43. end

  44. toc
  45. disp('此代码使用matlab编程')
  46. disp(['Problem37所用时间为: ',num2str(toc),'秒'])
  47. disp(['Problem37的答案为: ',num2str(Output)])
  48. end
  49. %% 得到n以下的所有质数
  50. function Vector = GetPrime(n)
  51. if nargin == 0
  52. n = 10000;
  53. end

  54. Judge = ones(1,n-1);
  55. Judge(1) = 0;
  56. for ii = 1:n-1
  57.     if Judge(ii) == 1
  58.         for jj = 2*ii : ii : n-1
  59.             Judge(jj) = 0;
  60.         end
  61.     end
  62. end
  63. Vector = find(Judge == 1);
  64. end
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-12 13:27:06 | 显示全部楼层
  1. from time import time
  2. start = time()

  3. def judgePrime(n):
  4.         if n == 1:
  5.             return False
  6.         for i  in range(2,int(n**0.5)+1):
  7.             if n % i == 0 and n != 2:
  8.                 return False
  9.         return True

  10. def getNumber(n):
  11.     test_list = []
  12.     test_str = str(n)
  13.     for i in range(0,len(test_str)):
  14.             result_str = test_str[i:]
  15.             test_list.append(int(result_str))
  16.             result_str = test_str[0:len(test_str)-i]
  17.             test_list.append(int(result_str))
  18.     return set(test_list)

  19. if __name__ == "__main__":
  20.   list = []
  21.   count = 1
  22.   number = 11
  23.   while count<= 11:
  24.       if judgePrime(number):
  25.           for each in getNumber(number):
  26.                   if not judgePrime(each):
  27.                       break
  28.           else:
  29.               count +=1
  30.               list.append(number)
  31.       number +=1
  32.   print(sum(set(list)))

  33.   print("Program running cost %4f secs!"%(time()-start))
复制代码


748317
Program running cost 6.923396 secs!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-7 05:07:50 | 显示全部楼层
  1. from time import time

  2. def tailor(num):
  3.     temp = str(num)
  4.     for i in range(1,len(temp)):
  5.         temp = temp[1:]
  6.         yield int(temp)
  7.         
  8.     temp = str(num)
  9.     for j in range(1,len(temp)):
  10.         temp =temp[:-1]
  11.         yield int(temp)

  12. def prime():
  13.     a,temp = 5,[2,3]
  14.     while True:
  15.         for k in temp:
  16.             if a%k == 0:
  17.                 break
  18.             elif k*k > a:
  19.                 temp.append(a)
  20.                 yield a
  21.                 break
  22.         a += 2

  23. def prime2():
  24.     temp = [False,False,2,3]
  25.     a,begin = 0,3
  26.     for k in prime():
  27.         for l in range(begin+1,k):
  28.             temp.append(False)
  29.         temp.append(k)
  30.         begin  = k
  31.         T = True
  32.         if k > 10:
  33.             for n in tailor(k):
  34.                 if not temp[n]:
  35.                     T = False
  36.                     break
  37.             if T:
  38.                 a += 1
  39.                 print(k)
  40.             if a == 11:
  41.                 return True
  42.                
  43. start = time()
  44. prime2()
  45. print('cost %.2fs'%(time()-start))
复制代码



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

使用道具 举报

发表于 2019-3-28 11:31:58 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:37 编辑
  1. def isPrime(num):
  2.     if num <= 1:
  3.         return False
  4.     i = 2
  5.     while i * i <= num:
  6.         if num % i == 0:
  7.             return False
  8.         i += 1
  9.     return True

  10. def isTruncatablePrime(num):
  11.     str1 = str(num)
  12.     length = len(str1)
  13.     if isPrime(num):
  14.         boolTemp = []
  15.         for i in range(length):
  16.             boolTemp.append(isPrime(int(str1[i:])))
  17.             boolTemp.append(isPrime(int(str1[:length-i])))
  18.         if False in boolTemp:
  19.             return False
  20.         else:
  21.             return True
  22.     else:
  23.         return False

  24. TruncatablePrimeNumList = []
  25. for num in range(10, 1000000):
  26.     if isTruncatablePrime(num):
  27.         TruncatablePrimeNumList.append(num)

  28. print(TruncatablePrimeNumList)
复制代码

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

使用道具 举报

发表于 2019-6-13 17:14:32 | 显示全部楼层
结果是:[23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797, 739397]
用时:0.5460035 秒

  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 get_result():
  12.     result = []
  13.     count = 0
  14.     num_index = 10
  15.     prime_lists = prime_list(1000000)
  16.     while count != 11:
  17.         if prime_lists[num_index]:
  18.             mark = 1
  19.             for i in range(1, len(str(num_index))):
  20.                 if not prime_lists[int(str(num_index)[i:])] or not prime_lists[int(str(num_index)[:-i])]:
  21.                     mark = 0
  22.                     break
  23.             if mark:
  24.                 result.append(num_index)
  25.                 count += 1
  26.         num_index += 1
  27.     return result

  28. print("结果是:{}\n用时:{} 秒".format(get_result(), time.process_time()))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 17:21:31 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-5-2 16:56 编辑

C++ 25ms
  1. #define max 1000000
  2. #include<iostream>
  3. using namespace std;
  4. int arr[max];


  5. bool judge(int d) {
  6.     int temp = d, p = 1;

  7.     while (temp /= 10) {
  8.         if (arr[temp]) {
  9.             return false;
  10.         }
  11.     }

  12.     while (d) {
  13.         temp += (d % 10) * p;
  14.         p *= 10;
  15.         d /= 10;
  16.         if (arr[temp]) {
  17.             return false;
  18.         }
  19.     }

  20.     return true;
  21. }


  22. int main() {
  23.     int i, j, k, count = 11, sum = 0;
  24.     arr[0] = arr[1] = 1;

  25.     for (j = 4; j < max; j += 2) {
  26.         arr[j] = 1;
  27.     }

  28.     for (i = 3; i < 10; i += 2) {
  29.         if (!arr[i]) {
  30.             for (j = i << 1; j < max; j += i) {
  31.                 arr[j] = 1;
  32.             }
  33.         }
  34.     }

  35.     for (i = 11; i < max && count; i += 2) {
  36.         if (!arr[i]) {
  37.             if (judge(i)) {
  38.                 sum += i;
  39.                 count--;
  40.             }

  41.             k = i << 1;

  42.             for (j = k + i; j < max; j += k) {
  43.                 arr[j] = 1;
  44.             }
  45.         }
  46.     }

  47.     cout << sum << endl;
  48.     return 0;
  49. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-12 17:18:56 | 显示全部楼层
748317

Process returned 0 (0x0)   execution time : 0.450 s
Press any key to continue.
利用双端队列,实现数字到字串的转换,再分别从两个方向处理
  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. const int il[] = {0,4,6,8};
  11. deque<int> v;
  12. int n;

  13. void euler_sieve(){
  14.   prime[1] = false;
  15.   for (int i = 2;i <= M;i++) prime[i] = true;

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

  24. bool illegal(){
  25.   for (int i = 0;i < v.size();i++)
  26.     for (int j = 0;j < 4;j++)
  27.     if (v[i] == il[j]) return true;
  28.   return false;
  29. }

  30. void prt(){
  31.   for (int i = 0;i < v.size();i++)
  32.     cout << v[i] << " ";
  33.   cout << endl;
  34. }

  35. bool parse(int x){
  36.   v.clear();
  37.   while(x){
  38.     v.push_front(x % 10);
  39.     x /= 10;
  40.   }
  41.   //prt();
  42.   if (illegal()) return true;
  43.   return false;
  44. }

  45. int main(){
  46.   euler_sieve();
  47.   int cnt = 0,sum = 0;
  48.   for (int i = 23; ;i++){
  49.     if (parse(i)) continue;
  50.     bool trun = true;

  51.     int t = 0,sz = v.size(),times = 1;
  52.     for (int j = sz-1;j >= 0;j--){
  53.       t += v[j] * times;//自右向左
  54.       //cout << t << endl;
  55.       if (!prime[t])  {trun = false;  break;}
  56.       times *= 10;
  57.     }

  58.     t = 0;
  59.     for (int j = 0;j < sz;j++){
  60.       t *= 10;  t += v[j];//自左向右
  61.       if (!prime[t])  {trun = false;  break;}
  62.     }
  63.     if (trun) {cnt++; sum += i;
  64.     //cout << i << endl;
  65.     }
  66.     if (cnt == 11)  break;
  67.   }
  68.   cout << sum << endl;
  69.   return 0;
  70. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-5 11:09:47 | 显示全部楼层
  1. from time import time

  2. def prime(n):
  3.     if n<=1:
  4.         return False
  5.     elif n == 2 or n==3:
  6.         return True
  7.     else:
  8.         for i in range(2,int(n**0.5+1)):
  9.             if n%i==0:
  10.                 return False
  11.         else:
  12.             return True
  13.    
  14. list1 = []

  15. def zuo(n):
  16.     a = len(str(n))-1
  17.     while a:
  18.         n = int(str(n)[1:])        
  19.         if prime(n):
  20.             a -= 1
  21.         else:
  22.             return False
  23.     if a==0:
  24.         return True
  25.      
  26. def you(n):
  27.     m = list(str(n))
  28.     a = len(m)-1
  29.     while a:
  30.         m.pop()
  31.         b = int(''.join(m))
  32.         if prime(b):
  33.             a -= 1
  34.         else:
  35.             return False
  36.     if a==0:
  37.         return True

  38. t = time()
  39. for i in range(10,1000000):
  40.     if '0' in str(i):
  41.         continue
  42.     else:
  43.         if prime(i):
  44.             if zuo(i):
  45.                 if you(i):
  46.                     list1.append(i)

  47. print(list1,sum(list1))
  48. print('cos %s' % (time()-t))

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

使用道具 举报

发表于 2020-10-31 11:40:12 | 显示全部楼层
  1. start = time.time()

  2. a = 2
  3. primes = []
  4. fancyprimes = []
  5. while a < 10000:
  6.         check = 0
  7.         for i in range(2,int(math.sqrt(a))+1):
  8.                 if a % i == 0:
  9.                         check += 1
  10.         if check == 0:
  11.                 primes.append(a)
  12.         a += 1
  13. for each in primes[4:]:
  14.         each = str(each)
  15.         check = 0
  16.         for i in range(len(each) - 1):
  17.                 if int(each[0 : i+1]) not in primes or int(each[len(each)-1-i : len(each)]) not in primes:
  18.                         check += 1
  19.         if check == 0:
  20.                 fancyprimes.append(int(each))

  21. print(fancyprimes)


  22. end = time.time()
  23. print("共用时%f秒" %(end - start))
复制代码


[23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797]
共用时0.097235秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

  4. int check_num(int);
  5. void split(int num, int a[]);

  6. int check_num(int num) //判质数
  7. {
  8.         if (num == 2)
  9.         {
  10.                 return 1;
  11.         }
  12.         if (num == 1)
  13.         {
  14.                 return 0;
  15.         }
  16.         int i, j, k;
  17.         k = num;
  18.         j = sqrt(num + 1);
  19.        
  20.         for (i = 2; i <= j; i++)
  21.         {
  22.                 if (k % i == 0)
  23.                 {
  24.                         return 0;
  25.                 }
  26.         }
  27.         return 1;
  28. }

  29. void split(int num, int a[]) // 将数字各个位数存到a中
  30. {
  31.         char str[20];
  32.         int i, len;

  33.         sprintf(str, "%d", num);
  34.         len = strlen(str);

  35.         for (i = 0; i < len; i++)
  36.         {
  37.                 a[i] = str[i] - '0';
  38.         }
  39. }

  40. main()
  41. {
  42.         char str[32];
  43.         int i, j, k, m, len, flag = 1;
  44.         int n = 11, count = 0, a[32];

  45.         while (1)
  46.         {
  47.                 n += 2;

  48.                 if (count == 11)
  49.                 {
  50.                         break;
  51.                 }
  52.                 if (check_num(n))
  53.                 {
  54.                         split(n, a);
  55.                         sprintf(str, "%d", n);
  56.                         len = strlen(str);
  57.                         k = len - 1;
  58.                         j = 0;
  59.                         for (i = 0; i < len - 1; i++)//从左边截去
  60.                         {
  61.                                 j += a[k--] * pow(10, i);
  62.                                 if (check_num(j) == 0)
  63.                                 {
  64.                                         flag = 0;
  65.                                         break;
  66.                                 }
  67.                         }
  68.                         if (flag)
  69.                         {
  70.                                 j = 0;
  71.                                 for (i = 0; i < len - 1; i++)//从右边边截去
  72.                                 {
  73.                                         j += a[i];
  74.                                         if (check_num(j) == 0)
  75.                                         {
  76.                                                 flag = 0;
  77.                                                 break;
  78.                                         }
  79.                                         j *= 10;
  80.                                 }
  81.                         }
  82.                         if (flag)
  83.                         {
  84.                                 count++;
  85.                                 printf("%d ", n);
  86.                         }
  87.                 }
  88.                 flag = 1;
  89.                
  90.         }
  91. }
复制代码


秒出答案,判质数用欧拉筛法应该更快

答案:23 37 53 73 313 317 373 797 3137 3797 739397
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-3 17:42:01 | 显示全部楼层
  1. /*
  2. 答案:748317
  3. 耗时:0.006687秒
  4. */
  5. #include <cstring>
  6. #include <vector>
  7. #include <cstdio>
  8. using namespace std;

  9. const int N = 1000000;

  10. char cp[N + 4];
  11. vector<int> vp;

  12. int main(void)
  13. {
  14.   //筛法打素数表
  15.   memset(cp + 2, 1, (N + 2) * sizeof(char));
  16.   for (int i = 2; i <= 1000; ++i)
  17.   {
  18.     if (cp[i] == 0)
  19.       continue;
  20.     for (int j = i * i; j <= N; j += i)
  21.       cp[j] = 0;
  22.   }
  23.   vp.push_back(2);
  24.   for (int i = 3; i <= N; i += 2)
  25.   {
  26.     if (cp[i] == 1)
  27.       vp.push_back(i);
  28.   }
  29.   int k = 4, nCount = 0, nSum = 0, nV = (int)vp.size();
  30.   while (nCount < 11 && k < nV)
  31.   {
  32.     int p = vp[k++];//对素数逐个检查
  33.     char str_p[12];
  34.     sprintf_s(str_p, "%d", p);
  35.     //先从左向右检查
  36.     int nLen = strlen(str_p);
  37.     bool bFlag = true;//这个数是否满足要求的标志
  38.     for (int i = 1; i < nLen; ++i)
  39.     {
  40.       int a = atoi(str_p + i);//逐个截掉最左边的数字
  41.       if (cp[a] == 0)//检查是否是素数
  42.       {
  43.         bFlag = false;
  44.         break;
  45.       }
  46.     }
  47.     if (bFlag)
  48.     {
  49.       //再从右向左检查
  50.       for (int i = nLen - 1; i >= 1; --i)
  51.       {
  52.         str_p[i] = 0;//逐个截掉最右边的数字
  53.         int a = atoi(str_p);
  54.         if (cp[a] == 0)//检查是否是素数
  55.         {
  56.           bFlag = false;
  57.           break;
  58.         }
  59.       }
  60.       if (bFlag)//这个数满足要求
  61.       {
  62.         nSum += p;//累加值
  63.         ++nCount;//累加计数
  64.       }
  65.     }
  66.   }
  67.   printf_s("%d\n", nSum);
  68.   return 0;
  69. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-24 15:56:11 | 显示全部楼层
  1. import time as t
  2. import math

  3. start = t.perf_counter()


  4. def check_prime(a_num):
  5.     is_prime = True
  6.     for num_index in range(2, int(math.sqrt(a_num) + 1)):
  7.         if a_num % num_index == 0:
  8.             is_prime = False
  9.     return is_prime


  10. truncatable_primes = []
  11. bool_prime = [True] * 1000000
  12. bool_prime[0], bool_prime[1] = False, False
  13. for i in range(1000000):
  14.     is_truncatable = True
  15.     if bool_prime[i]:
  16.         if check_prime(i):
  17.             i_range = int(math.log10(i))
  18.             for j in range(1, i_range + 1):
  19.                 if not bool_prime[i // 10 ** j] or not bool_prime[i % (10 ** j)]:
  20.                     is_truncatable = False
  21.                     break
  22.             if is_truncatable and i > 10:
  23.                 truncatable_primes.append(i)
  24.                 if len(truncatable_primes) == 11:
  25.                     break
  26.         else:
  27.             bool_prime[i] = False
  28.         for k in range(i * 2, 1000000 - 1, i):
  29.             bool_prime[k] = False

  30. print(truncatable_primes)
  31. print(sum(truncatable_primes))
  32. print("It costs %f s" % (t.perf_counter() - start))
复制代码


[23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797, 739397]
748317
It costs 1.696134 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-15 18:28:30 | 显示全部楼层
运行结果
  1. $ time target/release/main
  2. 23
  3. 53
  4. 73
  5. 37
  6. 313
  7. 373
  8. 317
  9. 797
  10. 3137
  11. 3797
  12. 739397

  13. real        0m0.007s
  14. user        0m0.007s
  15. sys        0m0.000s
复制代码

题目结果
  1. sum=0;for i in `target/release/main`; do((sum+=i));done;echo $sum
  2. 748317
复制代码


使用 primal 库,Miller-Rabin方法检测质数
  1. use std::collections::HashSet;
  2. use primal::*;
  3. fn prime_r(x:u64) -> bool {
  4.     if x == 0 { return true;}
  5.     if ! is_prime(x) {return false;}
  6.     prime_r(x / 10)
  7. }
  8. fn main() {
  9.     let mut v = vec![2,3,5,7];
  10.     let mut bit = 1;
  11.     while ! v.is_empty() {
  12.         let mut r = Vec::new();
  13.         for i in v {
  14.             for j in 1..10 {
  15.                 let x = i + j * 10u64.pow(bit);
  16.                 if is_prime(x) {
  17.                     r.push(x);
  18.                 }
  19.             }
  20.         }
  21.         v = r;
  22.         bit += 1;
  23.         for i in &v {
  24.             if *i > 1e10 as u64 {
  25.                 return ();
  26.             }
  27.             if prime_r(*i) {
  28.                 println!("{i}");
  29.             }
  30.         }
  31.     }
  32. }
复制代码

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 14:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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