jzxx2884素数分解

题目描述
素数,又称质数,是指除 1 和其自身之外,没有其他约数的正整数。例如 2、3、5、13 都是合 数,而 4、9、12、18 则不是。
虽然素数不能分解成除 1 和其自身之外整数的乘积,但却可以分解成更多素数的和。
你需要编程 求出一个正整数最多能分解成多少个互不相同的素数的和。
例如,21 = 2 + 19是21的合法分解方法。21 = 2 + 3 + 5 + 11则是分解为最多素数的方法。

输入
n (10≤n≤200)。

输出
n 最多能分解成多少个不同的素数的和。

样例输入
样例1:
21
样例2:
128
样例输出
样例1:
4
样例2:
9

来源
2016江苏省青少年信息学奥林匹克小学组竞赛复赛

满分代码:
#include<iostream>
using namespace std;
int n,ans;
int a[205];
bool prime(int n)
{
	if(n==1)
		return 0;
	for(int i=2; i*i<=n; i++)
	{
		if(n%i==0)
		{
			return 0;
		}
	}
	return 1;
}
void search(int s,int step)
{
	for(int i=2; i<=s; i++)
	{
		if(prime(i)&&i>a[step-1])
		{
			a[step]=i;
			if(s-a[step]==0)
			{
				ans=max(ans,step);
			}
			else
			{
				search(s-a[step],step+1);
			}
		}
	}
}
int main()
{
	cin>>n;
	search(n,1);
	cout<<ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lyz060510/article/details/85396055