质数和分解

质数和分解(normal)

Time Limit:1000MS  Memory Limit:65536K
Total Submit:178 Accepted:66 

Description 

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


Input 

(prime.in)文件中的每一行存放一个自然数 n , 2≤n≤200。

Output 

(prime.out)依次输出每一个自然数 n 的本质不同的质数和表达式的数目。

Sample Input 


2

Sample Output 


1

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int f[300]={0},a[300],ans[300];
int k=0,n;
void zs()
{
	for (int i=2;i<=n;i++)//筛子 
	  if (!f[i])
	    {
	    	k++;
	    	a[k]=i;
	    	int j=i;
	    	while (j<=n)
	    	  {
	    	  	 f[j]=1;
	    	  	 j+=i;
			  }
		}
	
	  
}
int main()
{
	scanf("%d",&n);
	ans[0]=1;
	zs();
	for (int i=1;i<=k;i++)
	  for (int j=a[i];j<=n;j++)
	    ans[j]+=ans[j-a[i]];//转移方程 
	cout<<ans[n];
	return 0;
} 


/*
样例 
9 
9以内的质数   0 1 2 3 4 5 6 7 8 9
2            1 0 1 0 1 0 1 0 1 0
3                  1 1 1 1 1 2 2
5                      2 1 2 2 3 
7                          3 3 4
*/

  

I'm so lost but not afraid ,I've been broken and raise again
原文地址:https://www.cnblogs.com/sjymj/p/5325714.html