质数和分解

【题目描述】
任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质
数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一
种质数和的形式。例如,9 的质数和表达式就有四种本质不同的形式:
9 = 2 + 5 + 2 = 2 + 3 + 2 + 2 = 3 + 3 + 3 = 2 + 7 。
这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中
参加和运算的各个数的位置而直接得到另一个表达式。
试编程求解自然数 n 可以写成多少种本质不同的质数和表达式。
【输入描述】
文件中的每一行存放一个自然数 n(2 < n < 200) 。
【输出描述】
依次输出每一个自然数 n 的本质不同的质数和表达式的数目。
【输入样例】
200
【输出样例】

9845164

源代码:

#include<cstdio>
int n,s=1,i[47],f[201]={0}; //200之内,质数有47个。
int main()
{
    scanf("%d",&n);
    i[1]=2;
    for (int a=3;a<=n;a++)
    {
        bool t(0);
        for (int b=1;b<=s;b++)
          if (!(a%i[b]))
          {
              t=true;
              break;
          }
        if (!t)
          i[++s]=a;
    } //试除法2.0。 
    f[0]=1; //质数本身也是1种方案。
    for (int a=1;a<=s;a++)
      for (int b=i[a];b<=n;b++)
        f[b]+=f[b-i[a]]; //如此奇妙的方法,利用有顺序的逐次拼凑来更新方案数
    printf("%d",f[n]);
    return 0;
}
posted @ 2016-03-27 21:20  前前前世。  阅读(415)  评论(0编辑  收藏  举报