鱼C论坛

 找回密码
 立即注册
查看: 3143|回复: 14

题目49:找出由互为排列的4位数质数组成的序列

[复制链接]
发表于 2015-5-29 22:49:19 | 显示全部楼层 |阅读模式

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

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

x
Prime permutations

The arithmetic sequence, 1487, 4817, 8147, in which each of the terms increases by 3330, is unusual in two ways: (i) each of the three terms are prime, and, (ii) each of the 4-digit numbers are permutations of one another.

There are no arithmetic sequences made up of three 1-, 2-, or 3-digit primes, exhibiting this property, but there is one other 4-digit increasing sequence.

What 12-digit number do you form by concatenating the three terms in this sequence?

题目:

1487, 4817, 8147 这个序列,每个比前一个递增 3330,而且这个序列有两个特点:1. 序列中的每个数都是质数。 2. 每个四位数都是其他数字的一种排列。

1,2,3 位组成的三个质数的序列中没有具有以上性质的。但是还有另外一个四位的递增序列满足这个性质。

如果将这另外一个序列的三个数连接起来,组成的 12 位数字是多少?

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

使用道具 举报

发表于 2016-10-6 16:22:39 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-10-12 16:24 编辑
  1. 另外4位数字是:2969 6299 9629

  2. def isPrime(num):
  3.     if num == 2:
  4.         return True
  5.     elif num % 2 == 0:
  6.         return False
  7.     else:
  8.         for i in range(3,int(num**0.5+1),2):
  9.             if num % i == 0:
  10.                 return False
  11.         return True

  12. def main():
  13.     primes = sorted([x for x in range(1000, 10000) if isPrime(x)])
  14.     for a in primes:
  15.         b = a + 3330
  16.         c = b + 3330
  17.         # test 1: are primes
  18.         if b in primes and c in primes:
  19.             # test 2: are permutations of each other
  20.             if set(sorted(list(str(a)))) == set(sorted(list(str(b)))) == set(sorted(list(str(c)))):
  21.                 print (a, b, c)
  22. main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-29 21:06:03 | 显示全部楼层
  1. from itertools import permutations as per
  2. def isprime(n):
  3.     if n <= 1: return False
  4.     if n == 2: return True
  5.     if n % 2 == 0: return False
  6.     for i in range(3,int(n**0.5)+1,2):
  7.         if n % i == 0: return False
  8.     return True
  9. for i in per([1,2,3,4,5,6,7,8,9],3):
  10.     if i[0] > 3: break
  11.     n = i[0]*100+i[1]*10+i[2]
  12.     if sorted(list(str(n))) == sorted(list(str(n + 333))) == sorted(list(str(n + 666))):
  13.         for j in [1,3,7,9]:
  14.             if isprime(n*10+j) and isprime(n*10+j+3330) and isprime(n*10+j+6660):
  15.                 if n*10+j != 1487:
  16.                     print(n*10+j,n*10+j+3330,n*10+j+6660,sep = '')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-18 23:20:14 | 显示全部楼层
  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. list1=[]
  14. for i in range(1000,10000):
  15.     if Prime(i):
  16.         list1.append(i)
  17. for i in list1:
  18.     j = 1000
  19.     while True:
  20.         tmp = False
  21.         if i+j in list1 and i+2*j in list1:
  22.             tmp = True
  23.         if tmp:
  24.             a=set(str(i))
  25.             b=set(str(i+j))
  26.             c = set(str(i+2*j))
  27.             if a==b and b==c:
  28.                 print(i,i+j,i+2*j)
  29.                 break
  30.             else:
  31.                 tmp = False
  32.         if not tmp:
  33.             j+=10
  34.         if i+2*j>list1[-1]:
  35.             break
复制代码

运行结果:
1487 4817 8147
2969 6299 9629
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-16 15:15:51 | 显示全部楼层
本帖最后由 芒果加黄桃 于 2017-1-16 15:22 编辑
  1. # encoding:utf-8
  2. # 1487 4817 8147 都是质数 等差数列  找另外一组类似的四位数
  3. from time import time
  4. from itertools import permutations
  5. def getPrimes(N):
  6.     primes = [True] * N
  7.     primes[0], primes[1] = False, False
  8.     for i, prime in enumerate(primes):
  9.         if prime:
  10.             for j in range(i * i, N, i):
  11.                 primes[j] = False
  12.     return [k for k, p in enumerate(primes) if p and k > 1000]
  13. def isSeq(s_nums):
  14.     l_sums = list(s_nums)
  15.     l_sums.sort()
  16.     for i in range(0, len(l_sums)):
  17.         for j in range(i + 1, len(l_sums)):
  18.             for k in range(j + 1, len(l_sums)):
  19.                 if l_sums[i] - l_sums[j] == l_sums[j] - l_sums[k]:
  20.                     print(l_sums[i], l_sums[j], l_sums[k])
  21. def euler049(N=10000):
  22.     s_primes = set(getPrimes(N))
  23.     s_pass = set()
  24.     for each in s_primes:
  25.         if each in s_pass:
  26.             continue
  27.         l_tmp = list(str(each))
  28.         s_tmp = set()
  29.         for tt in permutations(l_tmp, 4):
  30.             s = ''
  31.             for t in tt:
  32.                 s += t
  33.             s_tmp.add(int(s))
  34.         joint_set = s_primes & s_tmp
  35.         s_pass = s_pass | joint_set
  36.         if len(joint_set) >= 3:
  37.             isSeq(joint_set)
  38. if __name__ == '__main__':
  39.     start = time()
  40.     euler049()
  41.     print('cost %.6f sec' % (time() - start))
复制代码


2969 6299 9629
1487 4817 8147
cost 0.022000 sec

完成后学习了其他几位老大的程序,发现原来还有差值3330这个条件可以用....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-14 11:18:40 | 显示全部楼层
%% Problem49.m
%最后编辑时间:2017-06-14 11:13 版本1.0
%找出三个四位数的质数,能够形成等差数列,且差值为3330,并且能够互为排列。
%这要的质数组有两组。找出第二组
%使用传统的三重循环

% 此代码使用matlab编程
% Problem49所用时间为10.2873秒
% Problem49的答案为[1487 4817 8147;2969 6299 9629]
  1. %% Problem49.m
  2. %最后编辑时间:2017-06-14 11:13 版本1.0
  3. %找出三个四位数的质数,能够形成等差数列,且差值为3330,并且能够互为排列。
  4. %这要的质数组有两组。找出第二组
  5. %使用传统的三重循环

  6. % 此代码使用matlab编程
  7. % Problem49所用时间为10.2873秒
  8. % Problem49的答案为[1487 4817 8147;2969 6299 9629]

  9. function Output = Problem49()
  10. tic
  11. %先刷出大于1000 小于10000 的素数组
  12. Limit = 10000;
  13. Judge = ones(1,Limit-1);
  14. Judge(1) = 0;
  15. for ii = 1:Limit-1
  16.     if Judge(ii) == 1
  17.         for jj = 2*ii : ii : Limit-1
  18.             Judge(jj) = 0;
  19.         end
  20.     end
  21. end
  22. PossiFactor = find(Judge == 1);
  23. All = PossiFactor(PossiFactor > 1000);
  24. Num = length(All);

  25. Output = P49(Num,All);
  26.                               
  27. toc

  28. disp('此代码使用matlab编程')
  29. disp(['Problem49所用时间为',num2str(toc),'秒'])
  30. disp(['Problem49的答案为',mat2str(Output)])
  31. end

  32. % 此程序为了解决欧拉计划的第十九题
  33. % 破除三重循环,使用return
  34. function Output = P49(Num,All)
  35. Output = zeros(2,3);
  36. Time = 0;
  37. for ii = 1 : Num-2
  38.     for jj = ii+1 : Num -1
  39.         for kk = jj+1 : Num
  40.             if All(jj) - 3330 == All(ii) && All(kk) - 3330 == All(jj)
  41.                 if strcmp(sort(num2str(All(ii))),sort(num2str(All(kk)))) == 1 && ...  %比较三个数是否为相互的排列数
  42.                         strcmp(sort(num2str(All(ii))),sort(num2str(All(jj)))) == 1
  43.                     Time = Time + 1;
  44.                     Output(Time,:) = [All(ii),All(jj),All(kk)];
  45.                     if Time == 2
  46.                         return
  47.                     end
  48.                 end
  49.             end
  50.         end
  51.     end
  52. end
  53. end
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 09:29:36 | 显示全部楼层
用的matlab
结果是:
296962999629
时间已过 0.028753 秒。
>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-30 02:13:56 | 显示全部楼层
  1. def isPrime(num):
  2.     if num <= 1:
  3.         return False
  4.     else:
  5.         for i in range(2, int(num**0.5+1)):
  6.             if num % i == 0:
  7.                 return False
  8.         else:
  9.             return True

  10. def numList(num):
  11.     numTemp = []
  12.     for i in range(int(len(str(num)))):
  13.         numTemp.append(int(str(num)[i]))
  14.     numTemp.sort()
  15.     return list(set(numTemp))

  16. #大于2的数为质数,其必然为奇数且为某4个数字的3种排列,所以最小为num1=1235
  17. #所以递增的数i必然为偶数,且最大取到(9999-num1)/2
  18. sequenceList = []
  19. for num1 in range(1235, 9996, 2):
  20.     for i in range(2, (9999-num1)//2+1, 2):
  21.         if isPrime(num1):
  22.             num2 = num1 + i
  23.             if isPrime(num2):
  24.                 num3 = num1 + 2*i
  25.                 if isPrime(num3):
  26.                     if numList(num1) == numList(num2) and numList(num1) == numList(num3):
  27.                         sequenceList.append((num1, num2, num3))
  28. #print(sequenceList)
  29. numStr = ""
  30. for each in sequenceList[-1]:
  31.     numStr += str(each)
  32. print(int(numStr))
复制代码

296962999629


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

使用道具 举报

发表于 2019-6-24 15:59:50 | 显示全部楼层
符合队列:1487--4817--8147
符合队列:2969--6299--9629
用时:0.12480079999999999 秒
  1. import itertools
  2. import time


  3. def is_prime(min_range, max_range):
  4.     bool_range = [1] * max_range
  5.     bool_range[0], bool_range[1] = 0, 0
  6.     for i, j in enumerate(bool_range):
  7.         if j:
  8.             for k in range(i**2, max_range, i):
  9.                 bool_range[k] = 0
  10.     return [x for x, p in enumerate(bool_range) if p and x > min_range]


  11. def cal_result():
  12.     t_primes = is_prime(1000, 10000)
  13.     s_primes = set(t_primes)

  14.     for each_num in t_primes:
  15.         tmp_result = []

  16.         for each_str in itertools.permutations(str(each_num)):
  17.             tmp_num = int(''.join(each_str))
  18.             if tmp_num in s_primes:
  19.                 tmp_result.append(tmp_num)
  20.                 s_primes.remove(tmp_num)
  21.         tmp_result.sort()
  22.         if len(tmp_result) >= 3:
  23.             for i in range(len(tmp_result) - 2):
  24.                 for j in range(i + 2, len(tmp_result)):
  25.                     if (tmp_result[j] + tmp_result[i])/2 in tmp_result:
  26.                         print("符合队列:{}--{}--{}".format(tmp_result[i], int((tmp_result[j] + tmp_result[i])/2), tmp_result[j]))

  27. if __name__ == "__main__":
  28.     cal_result()
  29.     print("用时:{} 秒".format(time.process_time()))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-19 18:35:06 | 显示全部楼层
148748178147
296962999629

Process returned 0 (0x0)   execution time : 0.025 s
Press any key to continue.
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;

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

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

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

  20. void parse(int a[],int x){
  21.   for (int i = 0;i < 4;i++){
  22.     a[i] = x % 10;
  23.     x /= 10;
  24.   }
  25. }

  26. bool judge(int a[][4]){
  27.   bool b1 = false,b2 = false;
  28.   int t[4];
  29.   for (int i = 0;i < 4;i++) t[i] = a[0][3-i];//反序,以下只需一论排列

  30.   do{
  31.     if (memcmp(t,a[1],sizeof(t) ) == 0) b1 = true;
  32.     if (memcmp(t,a[2],sizeof(t) ) == 0) b2 = true;
  33.   }while(next_permutation(t,t+4) );

  34.   return b1 && b2;
  35. }

  36. int main(){
  37.   euler_sieve();
  38.   int n[3] = {0};

  39.   for (int j = 1000;j+6660 < 10000;j++){
  40.     n[0] = j;
  41.     for (int i = 1;i < 3;i++) n[i] = n[0] + i*3330;
  42.     int a[3][4];
  43.     if (!prime[n[0] ] || !prime[n[1] ] || !prime[n[2] ]) continue;

  44.     for (int i = 0;i < 3;i++) parse(a[i],n[i]);

  45.     if (judge(a)) cout << n[0] << n[1] << n[2] << endl;
  46.   }
  47.   return 0;
  48. }
复制代码

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

使用道具 举报

发表于 2020-10-21 12:17:56 | 显示全部楼层
  1. list1 = []#存放1000-10000的所有质数

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

  11. for i in range(1000,10001):
  12.     if prime(i):
  13.         list1.append(i)

  14. def bj(a,b):
  15.     a = list(str(a))
  16.     a.sort()
  17.     b = list(str(b))
  18.     b.sort()
  19.     if a == b:
  20.         return True
  21.    
  22. list2 = []
  23. for i in range(len(list1)):
  24.     for j in range(1,i):
  25.         s = list1[i] - list1[j]
  26.         if bj(list1[j],list1[i]):
  27.             if (list1[i]+s) in list1:
  28.                 if bj(list1[i],list1[i]+s):
  29.                     list2.append((list1[j],list1[i],list1[i]+s))
  30.             
  31. print(list2)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-25 20:03:49 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>

  3. int check_prime(int);
  4. int check_prime(int num)//判质数
  5. {
  6.         int i, j;
  7.         j = sqrt(num + 1);
  8.         for (i = 2; i <= j; i++)
  9.         {
  10.                 if (num % i == 0)
  11.                 {
  12.                         return 0;
  13.                 }
  14.         }
  15.         return 1;
  16. }

  17. main()
  18. {
  19.         int i, j, k, m, n, p;

  20.         for (i = 1489; i < 10000; i += 2)
  21.         {
  22.                 int a[10] = { 0 };
  23.                 if (check_prime(i))
  24.                 {
  25.                         j = i + 3330;
  26.                         n = i;
  27.                         for (m = 0; m < 4; m++)//标记法,将i中各个位上的数用数组a标记
  28.                         {
  29.                                 p = n % 10;
  30.                                 a[p] = 1;
  31.                                 n /= 10;
  32.                         }
  33.                         n = j;
  34.                         for (m = 0; m < 4; m++)//判断加3330后是否是第一个数的排列
  35.                         {
  36.                                 p = n % 10;
  37.                                 if (a[p] == 0)
  38.                                 {
  39.                                         goto Label;//不是就直接到标签Label处开始下一轮循环
  40.                                 }
  41.                                 n /= 10;
  42.                         }
  43.                         if (check_prime(j))
  44.                         {
  45.                                 k = j + 3330;
  46.                                 n = k;
  47.                                 for (m = 0; m < 4; m++)//判断再加3330后是否是第一个数的排列
  48.                                 {
  49.                                         p = n % 10;
  50.                                         if (a[p] == 0)
  51.                                         {
  52.                                                 goto Label;
  53.                                         }
  54.                                         n /= 10;
  55.                                 }
  56.                                 if (check_prime(k))
  57.                                 {
  58.                                         printf("%d %d %d\n", i, j, k);
  59.                                         break;
  60.                                 }
  61.                         }
  62.                 }
  63.         Label:continue;
  64.         }
  65. }
复制代码


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

使用道具 举报

发表于 2021-10-22 21:31:04 | 显示全部楼层
#找出由互为排列的4位数质数组成的序列
from time import *
from math import *
from itertools import * #permutations([1,2,3,4], 4)
#验证是否是质数
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

def creat_increase(num):
    if is_prime(num):
        a = num
        b = num + 3330
        c = b + 3330
        if is_prime(b) and is_prime(c):
            return [a, b, c]
        else:
            return None
    else:
        return None

#判断是否满足排列条件
def contidion(seq):
    out_0 = 0
    out_1 = 0
    out_2 = 0
    out_list0 = []
    out_list1 = []
    out_list2 = []
    for i in str(seq[0]):
        out_0 += int(i)
        out_list0.append(i)
    out_list0.sort()
    for i in str(seq[1]):
        out_1 += int(i)
        out_list1.append(i)
    out_list1.sort()
    for i in str(seq[2]):
        out_2 += int(i)
        out_list2.append(i)
    out_list2.sort()
    if out_0 == out_1 == out_2 and\
       out_list0 == out_list1 == out_list2:
        return True
   
#生成相差3330且3个数都是质数的序列  列表
def creat_list():
    num = 1000
    total_list = []
    while num + 6660 < 9999:
        if creat_increase(num):
            total_list.append(creat_increase(num))
        num += 1
    return total_list
s = time()
for each in creat_list():
    if contidion(each):
        print(each)
e = time()
print("用时%.4f秒" % (e-s))
#'''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 17:10:42 | 显示全部楼层
  1. /*
  2. 答案:296962999629
  3. 耗时:0.0170646秒
  4. */
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <cstring>
  8. #include <cstdlib>
  9. using namespace std;

  10. char cp[10000];//素数表

  11. int main(void)
  12. {
  13.   //建立素数表
  14.   memset(cp, 1, 9998 * sizeof(char));
  15.   for (int i = 2; i <= 100; ++i)
  16.   {
  17.     if (cp[i] == 0)
  18.       continue;
  19.     for (int j = i * i; j < 10000; j += i)
  20.       cp[j] = 0;
  21.   }
  22.   char str[12] = "";
  23.   for (int i = 1000; i < 10000; ++i)//枚举第一个素数
  24.   {
  25.     if (cp[i] == 0 || i == 1487)
  26.       continue;
  27.     char str1[8] = "";
  28.     _itoa(i, str1, 10);
  29.     sort(str1, str1 + 4);
  30.     bool bFind = false;
  31.     for (int j = i + 1; j < 10000; ++j)//枚举第二个素数
  32.     {
  33.       if (cp[j] == 0)
  34.         continue;
  35.       char str2[8] = "";
  36.       _itoa(j, str2, 10);
  37.       sort(str2, str2 + 4);
  38.       if (strcmp(str1, str2) != 0)//比对各位数字是否是排列
  39.         continue;
  40.       int nD = j - i;//计算公差
  41.       if (j + nD >= 10000)
  42.         continue;
  43.       if (cp[j + nD] == 1)//找到第三个候选数
  44.       {
  45.         char str3[8] = "";
  46.         _itoa(j + nD, str3, 10);
  47.         sort(str3, str3 + 4);
  48.         if (strcmp(str1, str3) != 0)//比对各位数字是否是排列
  49.           continue;
  50.         //找到了
  51.         bFind = true;
  52.         //拼接数字
  53.         _itoa(i, str1, 10);
  54.         strcat(str, str1);
  55.         _itoa(j, str2, 10);
  56.         strcat(str, str2);
  57.         _itoa(j + nD, str3, 10);
  58.         strcat(str, str3);
  59.         break;
  60.       }
  61.     }
  62.     if (bFind)
  63.       break;
  64.   }
  65.   cout << str << endl;
  66.   return 0;
  67. }




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

使用道具 举报

发表于 2022-10-25 01:40:43 | 显示全部楼层
  1. import time as t
  2. import math
  3. from itertools import permutations

  4. start = t.perf_counter()


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


  11. bool_prime = [True] * 10000
  12. for pre in range(1000):
  13.     bool_prime[pre] = False

  14. for num in range(1000, 10000):
  15.     if not check_prime(num):
  16.         bool_prime[num] = False

  17. for j in range(1000, 10000):
  18.     if bool_prime[j]:
  19.         j_perm = set(permutations(str(j)))
  20.         bool_prime[j] = False
  21.         nums = [j]
  22.         count = 1
  23.         for k in j_perm:
  24.             k_str = ''
  25.             for m in k:
  26.                 k_str += str(m)
  27.             k_int = int(k_str)
  28.             if bool_prime[k_int]:
  29.                 count += 1
  30.                 bool_prime[k_int] = False
  31.                 nums.append(k_int)
  32.                 nums.sort()
  33.         if count >= 3:
  34.             for n in nums:
  35.                 if n + 6660 > 10000:
  36.                     break
  37.                 elif n + 3330 in nums and n + 6660 in nums:
  38.                     print(n, n + 3330, n + 6660)

  39. print("It costs %f s" % (t.perf_counter() - start))
复制代码



1487 4817 8147
2969 6299 9629
It costs 0.042802 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 21:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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