鱼C论坛

 找回密码
 立即注册
查看: 4248|回复: 18

题目47:找出最小的具有四个不同质数因子的四个连续整数

[复制链接]
发表于 2015-5-16 23:31:40 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 欧拉计划 于 2015-5-16 23:34 编辑
Distinct primes factors

The first two consecutive numbers to have two distinct prime factors are:

14 = 2 × 7
15 = 3 × 5

The first three consecutive numbers to have three distinct prime factors are:

BaiduShurufa_2015-5-16_23-33-59.png

Find the first four consecutive integers to have four distinct prime factors. What is the first of these numbers?

题目:

最小的两个具有两个不同质数因子的连续整数是:

14 = 2 × 7
15 = 3 × 5

最小的三个具有三个不同质数因子的连续整数是:

BaiduShurufa_2015-5-16_23-33-59.png

找出最小的四个具有四个不同质数因子的整数。它们之中的第一个是多少?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-30 21:56:56 | 显示全部楼层
怎么我出来了好多。。
16:2 2 2 2
24:2 2 2 3
36:2 2 3 3
40:2 2 2 5
54:2 3 3 3
56:2 2 2 7
60:2 2 3 5
81:3 3 3 3
84:2 2 3 7
88:2 2 2 11
90:2 3 3 5
100:2 2 5 5
104:2 2 2 13
126:2 3 3 7
..........


  1. #include "myLib\\myLib.h"
  2. #include <vector>
  3. #pragma  comment(lib,"myLib\\myLib.lib")

  4. //分解质因数并且那啥
  5. bool div(int n)
  6. {
  7.         vector<int> result;
  8.         int num = 0;
  9.         int t = n;
  10.         while (1!=n)
  11.         {
  12.                 for (int i =2;i<=n;i++)
  13.                 {
  14.                         if(n%i==0)
  15.                         {
  16.                                 //i就是其中一个因数
  17.                                 //如果有一个因数不是质数 false
  18.                                 if(!iszhishu(i))
  19.                                         return false;
  20.                                 result.push_back(i);
  21.                                 num++;

  22.                                 if(num>4)//超过4个质因数了 咋办
  23.                                         return false;

  24.                                 n/=i;
  25.                                 i=1;

  26.                         }
  27.                 }
  28.         }
  29.         if(num!=4) return false;

  30.         std::cout<<t<<":";
  31.         for (int k=0;k<result.size();k++)
  32.         {
  33.                 std::cout<<result[k]<<" ";
  34.         }
  35.         std::cout<<endl;
  36.         return true;

  37. }
  38. int main(void)
  39. {
  40.        
  41.     for (int i = 1;i<10000;i++)
  42.     {
  43.                 div(i);
  44.                   
  45.     }
  46.         return 0;
  47. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-30 21:59:14 | 显示全部楼层
iszhishu 是个判断是否质数的函数 没带上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-6 12:47:53 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-10-12 15:53 编辑
迷雾少年 发表于 2016-8-30 21:56
怎么我出来了好多。。
16:2 2 2 2
24:2 2 2 3


看错题目,是4个连续数字,不是3个。
答案应该是134043


  1. class henum:
  2.     def __init__(self,num):
  3.         henum.num = 0
  4.         henum.yue = []

  5. def yueshu(num):
  6.     yuelist = []
  7.     for i in range(2,int(num**0.5+1)):
  8.         if isPrime(i):
  9.             if num%i == 0:
  10.                 yuelist.append(i)
  11.                 num1 = int(num/i)
  12.                 if isPrime(num1):
  13.                     yuelist.append(num1)
  14.                 else:
  15.                     yuelist = yuelist + yueshu(num1)
  16.     return yuelist

  17. def isPrime(num):
  18.     flag = 1
  19.     if num == 2:
  20.         return flag
  21.     elif num % 2 == 0:
  22.         flag = 0
  23.         return flag
  24.     else:
  25.         for i in range(3,int(num**0.5+1),2):
  26.             if num % i == 0:
  27.                 flag = 0
  28.                 break
  29.         return flag

  30. hnumlist = []
  31. for j in range(100000,200000):
  32.     if isPrime(j) == 0:
  33.         h=henum(j)
  34.         h.num = j
  35.         h.yue = list(set(yueshu(j)))
  36.         hnumlist.append(h)

  37. for k in range(3,len(hnumlist)):
  38.     if hnumlist[k-3].num == hnumlist[k-2].num -1 and hnumlist[k-2].num == hnumlist[k-1].num -1 and hnumlist[k-1].num == hnumlist[k].num -1:
  39.         if len(hnumlist[k-3].yue) == 4 and len(hnumlist[k-2].yue) == 4 and len(hnumlist[k-1].yue) == 4 and len(hnumlist[k].yue) == 4:
  40.                 print(hnumlist[k-3].num, hnumlist[k-3].yue)
  41.                 break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-16 11:42:43 | 显示全部楼层
  1. # encoding:utf-8
  2. # 找出最小的不能写作一个质数与一个平方数的二倍之和的奇合数
  3. from time import time
  4. from math import sqrt
  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]
  13. def findPrimeFactors(n, l_pr, s_pr):
  14.     if n in s_pr:
  15.         return [n]
  16.     sqr_n = int(sqrt(n)) + 1
  17.     result = list()
  18.     for pr in l_pr:
  19.         if n % pr == 0:
  20.             result.append(pr)
  21.             result.extend(findPrimeFactors(int(n / pr), l_pr, s_pr))
  22.             break
  23.         if pr > sqr_n:
  24.             break
  25.     return result
  26. def euler047(N=150000):
  27.     l_primes = getPrimes(N)
  28.     s_primes = set(l_primes)
  29.     l_result = dict()
  30.     for each in range(647, N):
  31.         tmp = findPrimeFactors(each, l_primes, s_primes)
  32.         if len(set(tmp)) == 4:
  33.             l_result[each] = tmp
  34.         else:
  35.             l_result.clear()
  36.         if len(l_result) == 4:
  37.             print(l_result)
  38.             break
  39. if __name__ == '__main__':
  40.     start = time()
  41.     euler047()
  42.     print('cost %.6f sec' % (time() - start))
复制代码

{134043: [3, 7, 13, 491], 134044: [2, 2, 23, 31, 47], 134045: [5, 17, 19, 83], 134046: [2, 3, 3, 11, 677]}
cost 0.955096 sec
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-6 00:47:05 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:20 编辑
  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. def cycle(a):
  13.     list1 = []
  14.     while True:
  15.         tmp = a
  16.         i = 2
  17.         while True:
  18.             if Prime(i):
  19.                 if tmp % i == 0:
  20.                     if i not in list1:
  21.                         list1.append(i)
  22.                     tmp = tmp/i
  23.                     i = 2
  24.                     continue
  25.                 elif Prime(tmp) or tmp == 1:
  26.                     if tmp not in list1:
  27.                         if Prime(tmp):
  28.                             list1.append(tmp)
  29.                     return list1
  30.                 else:
  31.                     i += 1
  32.             else:
  33.                 i += 1


  34. i = 2
  35. while True:
  36.     if not Prime(i):
  37.         if len(cycle(i)) == 4 and len(cycle(i+1)) == 4 and len(cycle(i+2)) == 4 and len(cycle(i+3)) == 4:
  38.             print(i)
  39.             break
  40.         else:
  41.             i += 1
  42.     else:
  43.         i += 1
复制代码
答案:134043
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 19:48:26 | 显示全部楼层
此代码使用matlab编程
Problem47所用时间为691.2743秒
Problem47的答案为134043
  1. %% Problem47.m
  2. %最后编辑时间:2017-06-13 13:16 版本1.0
  3. %找出连续四个数,四个数的没有相同的质因子,输出它们中的第一个

  4. % Problem47所用时间为691.2743秒
  5. % Problem47的答案为134043

  6. function Output = Problem47()
  7. tic

  8. Start = 644;
  9. Meet = 0;
  10. process = 1;
  11. while (Meet == 0)
  12.     Meet = 1;
  13.     Start = Start + process;
  14.     disp(Start)
  15.     AllNum = Start : Start + 3;
  16.     for ii = 1:4
  17.         if Isprime(AllNum(ii)) == 1
  18.             process = ii;
  19.             Meet = 0;
  20.             break
  21.         else
  22.             if RealFactorNum(AllNum(ii)) < 4
  23.                process = ii;
  24.                Meet = 0;
  25.                break
  26.             end
  27.         end
  28.     end      
  29. end

  30. Output = AllNum(1);
  31. toc

  32. disp('此代码使用matlab编程')
  33. disp(['Problem47所用时间为',num2str(toc),'秒'])
  34. disp(['Problem47的答案为',num2str(Output)])
  35. end
  36. %% Isprime.m
  37. %判定一个数是否为质数
  38. function Judge = Isprime(n)
  39. if nargin == 0
  40.     n = 64;
  41. end

  42. if n == 2
  43.     Judge = 1;
  44. else
  45.     if mod(n,2) == 0
  46.         Judge = 0;
  47.     else
  48.         Judge = 1;
  49.         for ii = 3: 2 :floor(sqrt(n)) + 1
  50.             if mod(n,ii) == 0
  51.                 Judge = 0;
  52.                 break
  53.             end
  54.         end
  55.     end
  56. end
  57. end

  58. %% 输入一个数得到其真因子的个数
  59. % 若输入为质数,则返回0
  60. function Output = RealFactorNum(n)
  61. if nargin == 0
  62. n = 64;
  63. end
  64. % if isprime(n) == 1
  65. %     Output = 0;
  66. % else
  67. %    PossiFactor = 1:n-1;
  68.     Judge = ones(1,n-1);
  69.     Judge(1) = 0;
  70.     for ii = 1:n-1
  71.         if Judge(ii) == 1
  72.             for jj = 2*ii : ii : n-1
  73.                 Judge(jj) = 0;
  74.             end
  75.         end
  76.     end
  77.     PossiFactor = find(Judge == 1);
  78.     PrimeFactor = [];
  79.     while (isprime(n) == 0)
  80.         for kk = 1:length(PossiFactor)
  81.             if mod(n, PossiFactor(kk)) == 0
  82.                 PrimeFactor = [PrimeFactor, PossiFactor(kk)];
  83.                 n = n/PossiFactor(kk);
  84.                 break
  85.             end
  86.         end
  87.     end
  88.     PrimeFactor = [PrimeFactor, n];
  89.     Output = length(unique(PrimeFactor));
  90. end
  91.    
  92.    
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 10:50:19 | 显示全部楼层
用的matlab:
结果是:
      134043

时间已过 4.581318 秒。
>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-10 11:49:07 | 显示全部楼层
  1. #include <iostream>
  2. #include <cmath>

  3. using namespace std;

  4. bool div(int num)
  5. {
  6.         int count=0;
  7.         for(int i=2;i<=num;i++)
  8.         {
  9.                 if(num%i==0)
  10.                 {
  11.                         num/=i;
  12.                         count++;
  13.                         while(num%i==0)
  14.                                 num/=i;
  15.                 }
  16.                 if(count==5)
  17.                         return false;
  18.         }
  19.         if(count==4)
  20.                 return true;
  21.         return false;
  22. }

  23. int main()
  24. {
  25.         int count=0;
  26.         for(int i=2;i<=100000000;i++)
  27.         {
  28.                 if(div(i))
  29.                         count++;
  30.                 else
  31.                         count=0;
  32.                 if(count==4)
  33.                 {
  34.                         cout<<i-3;
  35.                         return 0;
  36.                 }
  37.         }
  38. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-30 01:24:07 | 显示全部楼层
134043
  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 PrimeFactorList(num):
  11.     if isPrime(num):
  12.         return []
  13.     else:
  14.         PrimeFactorList = []
  15.         for i in range(2, int(num**0.5+1)):
  16.             while num % i == 0:
  17.                 num //= i
  18.                 PrimeFactorList.append(i)
  19.                 if isPrime(num):
  20.                     PrimeFactorList.append(num)
  21.         return list(set(PrimeFactorList))

  22. for num1 in range(2*3*5*7, 1000000):
  23.     num2 = num1 + 1
  24.     num3 = num1 + 2
  25.     num4 = num1 + 3
  26.     if len(PrimeFactorList(num1)) == 4:
  27.         if len(PrimeFactorList(num2)) == 4:
  28.             if len(PrimeFactorList(num3)) == 4:
  29.                 if len(PrimeFactorList(num4)) == 4:
  30.                     print(num1)
  31.                     break
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-24 14:28:26 | 显示全部楼层
本帖最后由 王小召 于 2019-6-24 14:31 编辑

借用楼上答案, 本题重点:对于大数据查找效率考量,速度从快到慢:set > dict > list 如果本题第16行用 if num in b_nums(也就是:in + list模式) 做替换,用时可能会多百倍,复杂度会从O(log N) 编程了 O(N)!!

结果是:{134043: [3, 7, 13, 491], 134044: [2, 2, 23, 31, 47], 134045: [5, 17, 19, 83], 134046: [2, 3, 3, 11, 677]}
用时:0.6084039 秒

  1. import time


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


  10. def composite_numbers(num, b_nums, s_nums, result = []):
  11.     if num in s_nums:
  12.         result.append(num)
  13.         return [num]

  14.     sqr_n = num**0.5 + 1
  15.     for each_prime in b_nums:
  16.         if not num % each_prime:
  17.             result.append(each_prime)
  18.             composite_numbers(int(num/each_prime), b_nums, s_nums, result)
  19.             break
  20.         elif each_prime > sqr_n:
  21.             break
  22.     return result


  23. def cal_(N):
  24.     b_nums = prime(N)
  25.     s_nums = set(b_nums)
  26.     d_result = {}
  27.     for number in range(647, N):
  28.         tmp = composite_numbers(number, b_nums, s_nums, [])
  29.         if len(set(tmp)) == 4:
  30.             d_result[number] = tmp
  31.         else:
  32.             d_result.clear()
  33.         if len(d_result) == 4:
  34.             return d_result

  35. print("结果是:{}\n用时:{} 秒".format(cal_(150000), time.process_time()))
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-5 13:39:13 | 显示全部楼层
  1. from time import process_time as t
  2. t1=t()
  3. from itertools import count
  4. def f(a):
  5.   l=set()
  6.   if a%2==0:
  7.     while a%2==0:a//=2
  8.     l.add(2)
  9.   while a!=1:
  10.     for i in range(3,int(a**0.5+1),2):
  11.       if a%i==0:
  12.         while a%i==0:a//=i
  13.         l.add(i)
  14.         break
  15.     else:
  16.       l.add(int(a))
  17.       break
  18.   return len(l)==4
  19. c=count(1)
  20. while 1:
  21.   n=c.__next__()
  22.   if f(n):
  23.     l=n
  24.     for i in range(3):
  25.       if not f(c.__next__()):break
  26.     else:break
  27. print(f'运行结果:{l}\n运行时间:{t()-t1}s')
复制代码
运行结果:134043
运行时间:0.734375s
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-5 13:40:52 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2019-8-5 13:44 编辑
王小召 发表于 2019-6-24 14:28
借用楼上答案, 本题重点:对于大数据查找效率考量,速度从快到慢:set > dict > list 如果本题第16行用 if ...


老哥说实话我看不懂你的代码……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-19 16:02:19 | 显示全部楼层
134043

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

  5. const int M = 5e5;
  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 solve(int x,set<int> & s){
  21.   for (int i = 1;x != 1;i++){
  22.     while (x % factor[i] == 0){
  23.       s.insert(factor[i]);
  24.       x /= factor[i];
  25.     }
  26.   }
  27. }

  28. bool judge(set<int> s[]){
  29.   for (int i = 0;i < 4;i++)
  30.     if (s[i].size() != 4) return false;

  31.   for (int i = 0;i < 3;i++){
  32.     for (int j = i+1;j < 4;j++){
  33.       if (s[i] == s[j]) return false;
  34.     }
  35.   }
  36.   return true;
  37. }

  38. int main(){
  39.   euler_sieve();

  40.   for (int i = 2;;i++){
  41.     set<int> s[4];
  42.     if (prime[i] || prime[i+1] || prime[i+2] || prime[i+3]) continue;

  43.     for (int j = 0;j < 4;j++) solve(i+j,s[j]);

  44.     if (judge(s)) {cout << i << endl; break;}
  45.   }
  46.   return 0;
  47. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
永恒的蓝色梦想 + 5 + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-23 15:16:04 | 显示全部楼层
  1. #找到一个数的所有质因数,运用元组
  2. #找满足要求的下一个数
  3. #两个列表,一个装质因数,一个装整数,用长度判断
  4. def prime(n):
  5.     if n == 2 or n==3:
  6.         return True
  7.     if n%2==0:
  8.         return False
  9.     else:
  10.         for i in range(3,int(n**0.5)+1,2):
  11.             if n%i==0:
  12.                 return False
  13.         return True
  14.    
  15. def zys(n):
  16.     l = []
  17.     for i in range(2,int(n/30)+1):#因为找四个不同质因数,那前三个质因数最小是2、3、5
  18.         if n%i == 0 and prime(i):
  19.             l.append(i)
  20.     return l

  21. n = 647
  22. while n < 150000:
  23.     if len(zys(n)) ==4:
  24.         if len(zys(n+1)) ==4:
  25.             if len(zys(n+2)) ==4:
  26.                 if len(zys(n+3)) ==4:
  27.                     print(n,zys(n))
  28.                     print(n+1,zys(n+1))
  29.                     print(n+2,zys(n+2))
  30.                     print(n+3,zys(n+3))
  31.                     break
  32.     n += 1

  33.    
复制代码


是有点菜,但是幸好可以算出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-21 16:47:21 | 显示全部楼层
迷雾少年 发表于 2016-8-30 21:56
怎么我出来了好多。。
16:2 2 2 2
24:2 2 2 3

你再看看题目
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-21 17:10:29 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <time.h>

  3. int check_num(int);
  4. int check_num(int num)//判断是否有四个不同的质数因子
  5. {
  6.         int i, j, k, count = 0;
  7.         k = num;
  8.         for (i = 2; i <= num / 2; i++)
  9.         {
  10.                 if (k % i == 0)
  11.                 {
  12.                         count++;
  13.                 }
  14.                 while (k % i == 0)
  15.                 {
  16.                         k /= i;
  17.                 }               
  18.         }
  19.         if (count == 4)
  20.         {
  21.                 return 1;
  22.         }
  23.         else
  24.         {
  25.                 return 0;
  26.         }
  27. }

  28. main()
  29. {
  30.         int i = 644, j;
  31.         int begin = time(NULL), end;

  32.         while (1)
  33.         {
  34.                 i++;
  35.                 j = i;
  36.                 if (check_num(j))
  37.                 {
  38.                         if (check_num(++j))
  39.                         {
  40.                                 if (check_num(++j))
  41.                                 {
  42.                                         if (check_num(++j))
  43.                                         {
  44.                                                 printf("%d\n", i);
  45.                                                 break;
  46.                                         }
  47.                                 }
  48.                         }
  49.                 }
  50.                
  51.         }
  52.         end = time(NULL);
  53.         printf("time = %ds", end - begin);
  54. }
复制代码


134043
time = 28s
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 12:22:58 | 显示全部楼层
本帖最后由 guosl 于 2022-1-8 12:35 编辑
  1. /*
  2. 欧拉问题47
  3. 答案:134043
  4. 耗时:0.0228895秒
  5. */
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <cstring>
  9. #include <cmath>
  10. using namespace std;

  11. const int INF = 0x7fffffff;
  12. const int nSteps = 1000;

  13. bool chkpcount(int n)//计算n中的素因数的个数是否是4
  14. {
  15.   if (n == 1 || n == 2)
  16.     return false;
  17.   int nCount = 0;//记录素因数的个数
  18.   if (n % 2 == 0)
  19.   {
  20.     ++nCount;
  21.     while (n % 2 == 0)
  22.       n /= 2;
  23.   }
  24.   int k = 3;
  25.   while (n > 1 && nCount <= 4)
  26.   {
  27.     int d = (int)sqrt((double)n);
  28.     bool bFlag = true;
  29.     for (; k <= d; k += 2)//找出当前n的最小素因数
  30.     {
  31.       if ((n % k) == 0)//找到一个比n小的素因数
  32.       {
  33.         bFlag = false;
  34.         ++nCount;
  35.         while (n % k == 0)//将n中的所有因数k除掉
  36.           n /= k;
  37.         break;
  38.       }
  39.     }
  40.     if (bFlag)//没有找到比n小的素因数,故n本身是一个素数
  41.     {
  42.       ++nCount;
  43.       break;
  44.     }
  45.   }
  46.   return (nCount == 4);
  47. }

  48. int main(void)
  49. {
  50.   char p[nSteps + 5];
  51.   int k = 647;
  52.   int nResult = INF;
  53.   p[nSteps + 4] = 0;
  54.   while (true)
  55.   {
  56.     memset(p, '0', (nSteps + 4) * sizeof(char));
  57.     for (int i = 0; i < nSteps + 4; ++i)//+4是为了解决前后重叠的问题
  58.     {
  59.       int j = i + k;
  60.       if (chkpcount(j))
  61.         p[i] = '1';//标记哪些数是有4个素数因数
  62.     }
  63.     char* pi = strstr(p, "1111");//查找是否有4个连续的存在
  64.     if (pi != NULL)//存在
  65.     {
  66.       int ip = int(pi - p) + k;
  67.       nResult = min(nResult, ip);//记录
  68.       break;//退出循环
  69.     }
  70.     else
  71.       k += nSteps;
  72.   }
  73.   cout << nResult << endl;
  74.   return 0;
  75. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-4 16:15:55 | 显示全部楼层
#利用一个数可以表示唯一的质数积形式,迭代后看范围类是否只有4个质数满足
#include<stdio.h>
#include<math.h>

int determine0(int i)
{
        int l;
        l=pow(i,0.5);
        for(int m=2;m<=l;m++)
        {
                if(i%m==0)
                {
                        return 0;
                }
        }
        return 1;
}

int determine1(int i)
{
        int num=0;
        //int k=pow(i,0.5);
        int k=i/30;
        for(int m=2;m<=k;m++)//for(int m=2;m<=k;m++)想错了,这里的范围弄错  了
        {
                if(determine0(m)&&i%m==0)
                {
                        num=num+1;
                        if(num>4)
                        {
                                return 0;
                        }
                }
        }
        if(num==4)
        {
                return 1;
        }
        return 0;
}
int main(void)
{
        int i=1;
        int x=100;
        while(i)
        {
                if(determine1(x)&&determine1(x+1)&&determine1(x+2)&&determine1(x+3))
                {
                        i=0;
                        printf("%d\n",x);
                }
                x=x+1;
        }
        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-20 02:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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