zoukankan      html  css  js  c++  java
  • 入门算法题——数学篇(二)

    转载请注明出处:http://www.cnblogs.com/xianyue

    题1:表达式

    题目描述

    给你三个数a,b,c,要求你在a,b,c之间加上加号“+”或者乘号“*”以及小括号,是的得到的表达式的结果最大,求这个最大的答案。
    举个例子,对于1,2,3来说:

    • 1+2*3=7
    • 1*(2+3)=5
    • 123=6
    • (1+2)*3=9

    所以答案是9。

    输入

    三个整数a,b,c(1<=a,b,c<=10)。

    输出

    所有表达式中能够得到的最大的值。

    样例输入

    1
    2
    3

    样例输出

    9

    题解

    可以发现对于a,b,c来说表达式总共就只有6种,即:

    • a+b*c
    • a*(b+c)
    • a*b*c
    • (a+b)*c
    • a+b+c
    • a*b*c

    所以我们只要求出上面6个表达式中的最大值就可以了。

    代码

    #include <iostream>
    using namespace std;
    int a, b, c;
    int main()
    {
        cin >> a >> b >> c;
        cout << max(
                    max(
                        max(a+b*c, (a+b)*c),
                        max(a*b+c, a*(b+c))
                        ),
                    max(a+b+c, a*b*c)
                    ) << endl;
        return 0;
    }
    

    题2:计算函数

    题目描述

    函数f的表达式如下:
    f(n) = -1+2-3+..+(-1)^n*n
    对于一个给定的正整数n,计算f(n)。

    输入

    一个正整数n。

    输出

    f(n)。

    样例输入1

    4

    样例输出1

    2

    样例输入2

    5

    样例输出2

    -3

    注:
    f(4) =  - 1 + 2 - 3 + 4 = 2
    f(5) =  - 1 + 2 - 3 + 4 - 5 =  - 3

    题解

    如果n为偶数,f(n)=n/2
    如果n为奇数,f(n)=-(n+1)/2

    代码

    #include <iostream>
    using namespace std;
    long long f(long long n)
    {
        if (n % 2 == 0)
            return n / 2;
        else
            return - (n + 1) / 2;
    }
    long long n;
    int main()
    {
        cin >> n;
        cout << f(n) << endl;
        return 0;
    }
    

    题3 数学理论

    题目描述

    给你一个大于等于12的数,将它表示成两个合数之和。
    注:

    • 素数是指除了1和它本身外不能被别的书整除的正整数
    • 合数是指除了素数以外的正整数

    输入

    一个数n

    输出

    任意两个合数,用空格分隔。使得这两个合数之和为n。

    样例输入

    12

    样例输出

    4 8

    题解

    可以发现,如果n是偶数的话,可以表示成4和n-4之和。其中4和n-4必为合数。
    如果n为奇数的话,只能美剧一个数a是4,6,8……这样下去,然后判断另一个数n-a是不是合数了。

    代码

    #include <iostream>
    using namespace std;
    int n;
    bool check(int m)
    {
        for (int i = 2; i *i <= m; i ++)
            if (m % i == 0)
                return true;
        return false;
    }
    int main()
    {
        cin >> n;
        if (n % 2 == 0)
            cout << 4 << " " << n - 4 << endl;
        else
            for (int i = 4; i < n; i += 2)
                if (check(n-i))
                {
                    cout << i << " " << n - i << endl;
                    break;
                }
        return 0;
    }
    

    题4:柠檬汁

    题目描述

    丽丽很喜欢和柠檬汁,她家里的冰箱里放了n瓶柠檬水(这里假设柠檬水就是柠檬汁和水的混合物),每一瓶柠檬水中柠檬汁的含量可能不一样。
    有一天丽丽回来很渴,所以她决定把n瓶柠檬水混到一个大杯子里面一口气喝完,但是在喝之前她想知道这瓶混合柠檬水的柠檬汁的比例。

    输入

    第一行包括一个正整数n,表示冰箱里之前放的柠檬水的杯数。
    第二行包括n个整数,分别表示n杯柠檬水中柠檬汁的百分比。

    输出

    求混合柠檬水中柠檬汁的百分比。

    样例输入

    3
    50 50 100

    样例输出

    66.666666666667

    题解

    可以看出这道题就是求一个平均数。

    代码

    #include <iostream>
    using namespace std;
    int n, a, s = 0;
    int main()
    {
        cin >> n;
        for (int i = 0; i <n; i ++)
        {
            cin >> a;
            s += a;
        }
        cout << (double)s / (double)n << endl;
        return 0;
    }
    

    题5: 找数

    题目描述

    找一个n位正整数,并且它能够被t整除。

    输入

    一行两个数n和t。(1<=n<=100, 2<=t<=10)

    输出

    输出能够被t整除的n位正整数。

    样例输入

    3 2

    样例输出

    712

    题解

    首先我们来分析一下能被2到10的这些数整除的输的特征:

    • 被2整除:偶数,即末位是0,2,4,6,8即可。
    • 被3整除:所有的位数之和为3的倍数。
    • 被4整除:后两位是4的倍数。
    • 被5整除:末尾是0或5.
    • 被6整除:所有位数之和是3的倍数,并且是偶数。
    • 被7整除:这个比较麻烦,暂时不分析。
    • 被8整除:后三位是8的倍数。
    • 被9整除:所有的位数之和是9的倍数。
    • 被10整除:末位是0。

    然后分析一下可以发现,如果t是{2,3,4,5,6,7,8,9}的话,我们的答案是n个t就可以了。
    如果t是10,则答案是n-1个1加一个0就是其中的一个答案。
    只有n1且t10时没有答案。

    所以可以按照这种描述写代码。

    代码

    #include <iostream>
    using namespace std;
    int n, t;
    int main()
    {
        cin >> n >> t;
        if (n == 1 && t == 10)
            cout << -1 << endl;
        else if (t < 10)
        {
            for (int i = 0; i < n; i ++)
                cout << t;
            cout << endl;
        }
        else
        {
            for (int i = 1; i < n; i ++)
                cout << "1";
            cout << "0" << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    存储过程与函数
    12个非常实用的JavaScript小技巧
    用JS获取地址栏参数的方法
    sql server split函数
    Matplotlib 保存图片、图画接口和显示中文的使用方法
    pandas 分组操作
    pandas 字符串相关操作以及数据间的合并与重塑
    pandas 分层索引
    pandas 轴索引的重命名,离散化,异常值的处理与随机方法
    pandas 缺失值、重复值的处理与值的替换
  • 原文地址:https://www.cnblogs.com/xianyue/p/7136645.html
Copyright © 2011-2022 走看看