鱼C论坛

 找回密码
 立即注册
查看: 2901|回复: 7

题目77:最小的可以以五千种以上的方式写成质数之和的数是多少?

[复制链接]
发表于 2015-11-5 17:11:38 | 显示全部楼层 |阅读模式

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

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

x
Prime summations

It is possible to write ten as the sum of primes in exactly five different ways:

7 + 3
5 + 5
5 + 3 + 2
3 + 3 + 2 + 2
2 + 2 + 2 + 2 + 2

What is the first value which can be written as the sum of primes in over five thousand different ways?

题目:

10 可以以 5 种方式写成质数之和:

7 + 3
5 + 5
5 + 3 + 2
3 + 3 + 2 + 2
2 + 2 + 2 + 2 + 2

第一个能够以五千种以上的方式写成质数之和的数是多少?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-16 19:05:17 | 显示全部楼层
答案71:
  1. primes = [True]*100        
  2. def getPrime(n):
  3.     primes[0], primes[1] = False, False
  4.     for (i, prime) in enumerate(primes):
  5.         if prime:
  6.             for j in range(i*i,n,i):
  7.                 primes[j] = False
  8.     primelist = []
  9.     for (k, trueprime) in enumerate(primes):
  10.         if trueprime:
  11.             primelist.append(k)
  12.     return primelist

  13. prime = getPrime(100)
  14. P=len(prime)
  15. R=[[0]*P for i in range(100)]
  16. for k in range(P):
  17.     R[0][k]=1
  18. for n in range(0,100,2):
  19.     R[n][0]=1
  20. for n in range(2,100):
  21.     for k in range(1,P):
  22.         R[n][k]=R[n][k-1]
  23.         if prime[k]<=n:
  24.             R[n][k]+=R[n-prime[k]][k]
  25.     if R[n][-1]>=5000 and not primes[n] or R[n][-1]>=5001:
  26.         print(n)
  27.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-17 14:19:39 | 显示全部楼层

26行没看懂,老大能帮解释一下么?多谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-17 15:02:49 | 显示全部楼层
芒果加黄桃 发表于 2017-2-17 14:19
26行没看懂,老大能帮解释一下么?多谢

典型的动态规划算法,你把1~10的R的二维数组跟着我的程序画一遍就知道了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-17 15:18:08 | 显示全部楼层
jerryxjr1220 发表于 2017-2-17 15:02
典型的动态规划算法,你把1~10的R的二维数组跟着我的程序画一遍就知道了

判断退出条件成立的那个if语句没看明白...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-17 16:24:23 | 显示全部楼层
芒果加黄桃 发表于 2017-2-17 15:18
判断退出条件成立的那个if语句没看明白...

你对比一下质数和非质数看看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-7 00:24:50 | 显示全部楼层
用的matlab
结果是
  71

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

使用道具 举报

发表于 2021-7-4 10:06:56 | 显示全部楼层
本帖最后由 guosl 于 2022-1-14 09:53 编辑

本题其实与上题一样,只是选择的和项只能是素数而已。用递推就不太容易做了,但换成母函数却非常容易,只是在构造母函数时只选择素数来构造就行了。
  1. /*
  2. 答案:71
  3. 耗时:0.0001137秒
  4. */
  5. #include <iostream>
  6. #include <cstring>
  7. using namespace std;

  8. struct stPolynomial//母函数对应的多项式
  9. {
  10.   int a[101];
  11.   stPolynomial(void)
  12.   {
  13.     memset(a, 0, sizeof(a));
  14.   }
  15.   stPolynomial(int k)
  16.   {
  17.     memset(a, 0, sizeof(a));
  18.     for (int i = 0; i*k <= 100; ++i)
  19.       a[i*k] = 1;
  20.   }
  21.   stPolynomial(const stPolynomial &p)
  22.   {
  23.     memcpy(a, p.a, sizeof(a));
  24.   }
  25.   const stPolynomial& operator=(const stPolynomial &p)
  26.   {
  27.     memcpy(a, p.a, sizeof(a));
  28.     return *this;
  29.   }
  30.   stPolynomial operator*(const stPolynomial &p) const
  31.   {
  32.     stPolynomial x;
  33.     for (int i = 0; i <= 100; ++i)
  34.     {
  35.       for (int j = 0; j <= 100; ++j)
  36.       {
  37.         if (i + j <= 100)
  38.           x.a[i + j] += a[i] * p.a[j];
  39.       }
  40.     }
  41.     return x;
  42.   }
  43. };

  44. int main(void)
  45. {
  46.   char cp[100];//构建100以内的素数表
  47.   memset(cp, 1, 100 * sizeof(char));
  48.   cp[0] = 0;
  49.   cp[1] = 0;
  50.   for (int i = 2; i <= 10; ++i)
  51.   {
  52.     if (cp[i] == 0)
  53.       continue;
  54.     for (int j = i * i; j < 100; j += i)
  55.       cp[j] = 0;
  56.   }
  57.   stPolynomial f(2);
  58.   int k = 3;
  59.   while (true)
  60.   {
  61.     stPolynomial g(k);
  62.     f = f * g;//用所有小于k的素数进行组合
  63.     if (f.a[k] > 5000)//检查组合数是否大于5000
  64.       break;
  65.     //选择下一个素数
  66.     k += 2;
  67.     while (cp[k] == 0)
  68.       k += 2;
  69.   }
  70.   cout << k << endl;
  71.   return 0;
  72. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-11 16:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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