• Vijos 1033 整数分解(版本2)


    描述

    整数分解(版本2)
    一个正整数可以分解成若干个自然数之和。请你编一个程序,对于给出的一个正整数n(1<=n<=1500),求出满足要求的分解方案,并使这些自然数的乘积m达到最大。
    例如n=10,则可以分解为2+2+3+3,乘积m=2*2*3*3=36

    格式

    输入格式

    一个正整数n

    输出格式

    输出分解的自然数的最大乘积m

    样例1

    样例输入1

    10

    样例输出1

    36

    题解

    通过对这道题的分析,可以发现:
    如果n1,2,3,则不用分;
    如果n=4,则分成两个2和部分都是一样的;
    如果n
    5,则分成2和3是最大的;
    如果n6,则分成3和3是最大的;
    如果n
    7,则分成4和3是最大的;
    如果n8,则分成2和3和3是最大的;
    如果n
    9,则分成3和3和3是最大的;
    ……
    总结规律,我们可以发现如果一个数大于4的情况下,我们只要不断地分3就可以了。而这就是我们的解法。
    代码如下:

    #include <cstdio>
    #include <cstring>
    using namespace std;
    int a[1500], n;
    void init()
    {
        memset(a, 0, sizeof(a));
        a[0] = 1;
    }
    void  multi(int b)
    {
        int c = 0;
        for (int i = 0; i < 1500; i ++)
        {
            c = c + a[i] * b;
            a[i] = c % 10;
            c /= 10;
        }
    }
    void output()
    {
        int i = 1499;
        for (;i > 0 && a[i] == 0; i --);
        for (;i >= 0; i --)
        {
            printf("%d", a[i]);
        }
        printf("
    ");
    }
    int main()
    {
        init();
        scanf("%d", &n);
        while (n > 4)
        {
            n -= 3;
            multi(3);
        }
        multi(n);
        output();
        return 0;
    }
    

    这里唯一要考虑的问题是n<=1500,所以答案最大可能达到3^500,这是long long类型都保存不了的,所以需要用到大数乘法。

  • 相关阅读:
    RobotFramework+Selenium2+Appium环境搭建
    spring mvc 依赖包
    linux
    清理linux 某个文件夹下面所有的log文件
    selenium grid2 使用远程机器的浏览器
    IntelliJ Idea 快捷键
    aop注解 自定义切面的注解写法
    springmvc多视图配置
    @Autowired(required = false)
    pom.xml配置详解
  • 原文地址:https://www.cnblogs.com/xianyue/p/6933662.html
Copyright © 2020-2023  润新知