入门算法题——数学篇(二)

转载请注明出处: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;
}
原文地址:https://www.cnblogs.com/xianyue/p/7136645.html