U AlvinZH的奇幻猜想——合数篇
时间限制:1000ms 内存限制:65536kb
题目描述
大家一定听过著名的“哥德巴赫猜想”,猜想的一个版本指出:任何大于5的奇数都可以表示成三个素数之和。AlvinZH十分热爱数学,他也有一个猜想:任何正整数都可以分解成一个或多个合数之和。
AlvinZH很快就发现这个猜想不对,比如5就不行,但大部分数字还是可以的,而且还有多种分解方法。现在,请你帮他判断一个数能不能分解成一个或多个合数之和,如果不能,输出“-1”;否则,输出最多能分解成多少个合数。
输入
输入包括多组数据。
每组数据只含一个正整数n(1≤n≤10^9)。
输出
对于每组数据,输出-1或能分解的最大合数个数。
输入样例
1
12
输出样例
-1
3
样例解释
12=8+4=6+6=4+4+4,最多可以分解成三个合数之和。
题目分析
若要让合数个数最多,则n必定只由4,6,9组成。
n由n/4和n%4两部分组成。
四种情况:
(1)n%4 == 0:
全分成4就好了,所以ans = n/4
(2)n%4 == 1:
剩下的1要和两个4组合成一个9。
所以如果n/4 >= 2,ans = n/4 - 1
否则ans = -1
(3)n%4 == 2:
剩下的2要和一个4组合成一个6。
所以如果n/4 >= 1,ans = n/4
否则ans = -1
(4)n%4 == 3:
剩下的3 = 1 + 2。所以需要三个4,组成一个6和一个9。
所以如果n/4 >= 3,ans = n/4 - 1
否则ans = -1
示例代码
#include<cstdio>
int main()
{
int n,ans;
while(~scanf("%d",&n))
{
ans=0;
if(n%4==0) //n为4的倍数时,全分解成4
ans=n/4;
else if(n%4==1) //n除4余1时,将两个4和一个1组成9
{
if(n/4>=2)
ans=n/4-1;
else
ans=-1;
}
else if(n%4==2) //n除4余2时,剩下的2要和一个4组成一个6
{
if(n/4>=1)
ans=n/4;
else
ans=-1;
}
else if(n%4==3)
{
if(n/4>=3)
ans=n/4-1;
else
ans=-1;
}
printf("%d\n",ans);
}
}