2016级算法第二次练习赛——背包&DP大作战——U AlvinZH的奇幻猜想——合数篇

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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值