百度松果菁英班“天天向上”擂台赛第一期题解

整数运算

基本的输入输出

日期

格式化输入即可

平均分

基本的输入输出

最大公约数

高中数学:辗转相除法

整除幸运数

定义一个函数来实现提取某个数每位上的数字,一旦遇到不含7或者4的情况则返回false,代表此数不是幸运数,否则返回true

实现函数

eg1:

n = 8484848

第一次循环:n = 8484848,num = 8,不符合情况,返回false

eg2:

n = 4747447

第一次循环:n = 4747447,num = 7,符合情况,执行n /= 10(n /= 10等价于n = n / 10)

第二次循环:n = 474744,num = 4,符合情况,执行n /= 10(n /= 10等价于n = n / 10)

第三次循环:n = 47474,num = 4,符合情况,执行n /= 10(n /= 10等价于n = n / 10)

第四次循环:n = 4747,num = 7,符合情况,执行n /= 10(n /= 10等价于n = n / 10)

第五次循环:n = 474,num = 4,符合情况,执行n /= 10(n /= 10等价于n = n / 10)

第六次循环:n = 47,num = 7,符合情况,执行n /= 10(n /= 10等价于n = n / 10)

第七次循环:n = 4,num = 4,符合情况,执行n /= 10(n /= 10等价于n = n / 10)

第八次循环:由于4 / 10 = 0,n = 0,不满足while循环条件,跳出循环返回true

线段

本质为前n项和的求取的递推

以下分别为当n = 1、2、3、4时线段的条数

可以发现题目让求解的为(n - 1)的阶乘

在mian函数重调用即可

圆切平面

注意:本题求取的是平面

递推+贪心思维:假设新圆的添加总能完美相交于之前所有圆

一个圆截得的平面数2

两个圆截得的平面数4

三个圆截得的平面数为8

设n - 1个圆最多分割a[n - 1]个平面,在添加第n个圆之后能够完美分割前n -1个圆,于是新增加的平面数即为2 * (n - 1),由递推可得:a[i] = a[i - 1] + 2 * (n - 1)

如果还不清楚的话,请看数学推论

数字7

若是7的和或者差,则7必定为其因子,将n对7取余即可,注意特判,0也属于正确答案。例如:7 - 7

个人所得税

大模拟、if-else分支结构

偶数位

十进制与二进制的互相转换

十进制转二进制,定义trans函数

十进制转二进制的本质为:n不断模2取余,倒序链接即可

eg:

10

第一次循环:n = 10,num = 0,s += s + '0';s = "0";n /= 2;

第二次循环:n = 5,num = 1,s = s + '1';s = "01";n /= 2;

第三次循环:n = 2,num = 0,s = s + '0';s = "010" ;n /= 2;

第四次循环:n = 1,num = 1,s = s + '1';s = "0101" ;n /= 2;

第五次循环不再执行,因为n == 0跳出

再将s反转得到"1010"即为10的二进制数

替换偶数位为0

由于操作以右端为开头,反转过来操作即可,操作之后再反转返回

十进制转二进制

最右端为第0位,权重为2^0 = 1,其后随着位数的增加权重依次增大,累加即可

在main函数中调用即可

合并

对应数乘其权重累加

公式计算

注意c ++ 默认下取整,且有着即使命名为double s,s = 3 / 2仍不等于1.5的情况出现,避免此类情况将公式中出现的所有整数加个.0后缀即可

进制形式

可以偷个懒使用c语言的格式化输出

%o 八进制 %d 十进制 %x 十六进制

不偷懒的话也可以学学函数实现进制转换

等差数列

首先储存a,b,c,vector为c ++ 类型的动态数组,sort函数默认排序为升序排序

因此将这三个数存入vector后sort即可得到一个可能递增的有序序列(可能a == b || a == c || a == b && a == c && b == c)

由高中数学知识得,等差中项为前一项和后一项的和除以2

为了避免出现c ++ 向下取整的特殊情况,将公式进行等价变形

b = (a + c) / 2 -> 2 * b = a + c

网球比赛

无输入,逻辑思考出答案,直接输出即可

大小写的转换

根据ASCII码转换:ASCII表

小写英文字母的ASCII码比对应的大写英文字母的ASCII码要大32

宽度与对齐

%m.d输出宽度为m的整数

%d为右对齐,%-d为左对齐,

左右对齐

%m.nlf输出宽度为m,精度为n的浮点数

%lf为右对齐,%-lf为左对齐

输入宽度

格式化读入与格式化输出

宽度精度

使用c ++ 实现,#include <iomanip>为其头文件

setiosflags(ios::fixed)为输出固定位数

setprecision(m)为输出精度为m的小数

setw(n)为输出宽度为n的数字

四位数逆序

移步至上文《数字7》,同理,换汤不换药

整理玩具

公式递推:

假设有一个玩具:{1}

假设有两个玩具:{1,1} {2}

假设有三个玩具:{1,1,1} {1,2}

假设有四个玩具:{1,1,1,1} {1,1,2} {2,2}

假设有五个玩具:{1,1,1,1,1} {1,2,2} {1,1,1,2}

对应答案依次为:

当n = 1时,1 + 0 = 1

当n = 2时,1 + 1 = 2

当n = 3时,1 + 1 = 2

当n = 4时,1 + 2 = 3

当n = 5时,1 + 2 = 3

递推可得公式ans = 1 + n / 2

字符判断

if - else分支结构

单位矩阵

高等数学-线性代数之中的概念,于编程之中可以理解为只有主对角线元素为1,其余元素均为0的二维矩阵

闰年

闰年有两种情况

  1. 能被4整除且不能被100整除

  1. 能被400整除

时间也能加

只考虑题目要求,首先秒满60进1,其次分钟满60再进1

非常大的N

#include <cmath>库中的sqrt函数

sqrt(a,b)获取a的b次方

开方使b = 0.5即可,即a的0.5次方,a的开方

三角形坐标

根据公式输出计算即可,注意c ++ 向下取整以及double类型整数除整数仍得整数的情况,为整数添加.0后缀

向下取整

还是#include <cmath>库

sqrt函数(移步至《非常大的N》)和floor函数

floor(a);为对a的向下取整

eg:

floor(3.999999) = 3;

时刻求和

对12取余即可

点与线段的关系

首先题目当中包含无关的字符,要抑制这些字符的读入只读数字

其次判断点是否在线段上

  1. 三点共线公式

  1. 只有点位于线段上才算正确,因此点3到点1的距离与点3到点2的距离是严格小于等于点1到点2距离的

  1. 计算两点之间的距离

综上所述

卡罗尔数

化简4 * n - 2 * (n + 1) - 1 = 2 * n - 3 = N <---> n = (N + 3) / 2

在这里使用一个类型转换的方式

double n;根据输入的N求出n的值,题目要求n必须为正整数,因此浮点数n的小数位不能有数字double flag = n - int(n);来获取标志

eg:

输入N = 1,n = 4 / 2.0 = 2.0;int(n) = 2;double flag = 2.0 - 2 = 0

输入N = 2,n = 5 / 2.0 = 2.5;int(n) = 2;double flag = 2.5 - 2 = 0.5

因此,若是flag为0,则n为正整数,输出YES,否则输出NO

整除的总数

if语句

尾数为零

循环,if语句

数组的最大公约数

移步参考《最大公约数》

古人的剩余定理

if、循环

四边形坐标

公式计算

空间三角形

海伦公式,两点之间的距离公式

四叶玫瑰数

if语句

完美数字

if语句

指定集合

if、循环

阶乘数

循环,if

真因子

if、循环

平方根X

参考《非常大的N》中sqrt的函数用法与《向下取整》中floor函数的用法

全部整除

循环、选择

快来一起加入百度松果菁英班,一起学习算法与飞桨吧!!!

猜你喜欢

转载自blog.csdn.net/couchpotatoshy/article/details/128614102