Maximum splitting

Maximum splitting

You are given several queries. In the i-th query you are given a
single positive integer ni. You are to represent ni as a sum of
maximum possible number of composite summands and print this maximum
number, or print -1, if there are no such splittings.

An integer greater than 1 is composite, if it is not prime, i.e. if it
has positive divisors not equal to 1 and the integer itself.

Input The first line contains single integer q (1 ≤ q ≤ 105) — the
number of queries.

q lines follow. The (i + 1)-th line contains single integer ni
(1 ≤ ni ≤ 109) — the i-th query.

Output For each query print the maximum possible number of summands in
a valid splitting to composite summands, or -1, if there are no such
splittings.

Examples
Input
1
12
Output
3
Input
2
6
8
Output
1
2
Input
3
1
2
3
Output
-1
-1
-1

Note 12 = 4 + 4 + 4 = 4 + 8 = 6 + 6 = 12, but the first splitting has
the maximum possible number of summands.

8 = 4 + 4, 6 can’t be split into several composite summands.

1, 2, 3 are less than any composite number, so they do not have valid
splittings.

思路如下

  • 题意:这一题让判断一个数 最多能够被分成几个合数相加,能被分成几个答案就是 输出 几 ,但是如果某个数没法被分成几个合数相加 那么直接输出 - 1
  • 既然是让求最多可以被分成几个合数之和,那么我们考虑,每一份分的越小越好,而最小的合数是 4,那么我们先分尽量多的4,最后对 余数 进行一一讨论即可

题解如下

#include <bits/stdc++.h>
using namespace std;
 
int solve(int x)
{
    int t = x/4; //最多分成t个4
    int rest = x%4; //求出剩余部分
    if (rest==0) //刚好整除4 t就是最大值返回
        return t;
    if (rest==1) //余1 咋办 取出一个4 发现4+1=5 不是合数 那就取出两个 4*2+1=9 是合数 那么就9了
    {
        if (t>=2)
        {
            t-=2;
        }else
            return -1;
        t++;
        return t;
    }
    if (rest==2) //同理 余2 取出一个4 发现4+2=6是合数 那就取出一个就行 
    {
        if (t>=1)
        {
            t--;
        }else return -1;
        t++;
        return t;
    }
    if (rest==3) //同理 取出3个4 3*4+3=15是合数,这里切记 15 还可以 分成两个合数 6与9.因此 在下面的代码中 t += 2;
    {
        if (t>=3)
        {
            t-=3;
        }else return -1;
        t+=2;
        return t; //返回t
    }
}
 
int main()
{
    int q;
    scanf("%d",&q);
    for (int i = 1;i <= q;i++)
    {
        int x;
        scanf("%d",&x);
        printf("%d\n",solve(x));
    }
    return 0;
}

发布了84 篇原创文章 · 获赞 120 · 访问量 8645

猜你喜欢

转载自blog.csdn.net/qq_34261446/article/details/104094248