写点什么

每日算法刷题 Day2- 向上取整、三角形条件、字符串拼接匹配、三数排序思路

作者:timerring
  • 2022 年 9 月 29 日
    山东
  • 本文字数:2374 字

    阅读完需:约 8 分钟

⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法。

4. 区间

给定一个浮点数,请你判断该数字属于以下哪个区间:[0,25],(25,50],(50,75],(75,100]。


如果给定的数值小于 0 或大于 100,则程序输出 Fora de intervalo,表示超出范围。


开区间 (a,b):在实数 a 和实数 b 之间的所有实数,但不包含 a 和 b。


闭区间 [a,b]:在实数 a 和实数 b 之间的所有实数,包含 a 和 b。

输入格式

输入一个浮点数。

输出格式

判断输入数值位于哪个区间,按格式 Intervalo x 输出,其中 x 为区间范围 [0,25],(25,50],(50,75],(75,100]中的一个。


如果数值位于所有区间之外,则输出 Fora de intervalo

输入样例:

25.01
复制代码

输出样例:

Intervalo (25,50]
复制代码

代码

#include<iostream>#include<cmath>
using namespace std;
string s[4]={"[0,25]","(25,50]","(50,75]","(75,100]"};double a;
int main(){ cin>>a; a=ceil(a);//对浮点数向上取整
if(a<0||a>100) cout<<"Fora de intervalo";else if(a==0) cout<<"Intervalo [0,25]";else cout<<"Intervalo "<<s[((int)a-1)/25];
}
复制代码


思考:初始的表达方式过于冗余。同样这种方式也存在 a=0 时的冗余,但是总体来说 a=ceil 的向上取整方式可以借鉴。

5. 三角形

读取三个浮点数 A,B 和 C 并验证是否可以用它们形成三角形。


如果可能,则计算并输出三角形的周长:


Perimetro = XX.X
复制代码


如果不可能,则计算并输出以 A 和 B 为底以 C 为高的梯形面积:


Area = XX.X
复制代码

输入格式

共一行,包含三个浮点数 A,B,C。

输出格式

按题目描述格式,输出答案,答案保留一位小数。

数据范围

0<A,B,C<100.0

输入\出样例

输入样例 1:


6.0 4.0 2.0
复制代码


输出样例 1:


Area = 10.0
复制代码


输入样例 2:


6.0 4.0 2.1
复制代码


输出样例 2:


Perimetro = 12.1
复制代码

代码

#include<iostream>#include<cmath>using namespace std;int main(){    double a,b,c;    cin>>a>>b>>c;    //判断三边是否可构成三角形   两边之和>第三边 两边之差的绝对值<第三边    if(a+b>c && fabs(a-b)<c) printf("Perimetro = %.1lf",a+b+c);    else printf("Area = %.1lf",(a+b)*c/2);    return 0;}
复制代码


错误:构成三角形的条件:两边之和>第三边,两边之差的绝对值<第三边,这样就无需考虑三边之间大小关系。


在学习 C 语言的 printf 输出的时候,转义符“\”无法使用,若要输出 %,需要使用两个百分号,即 %%。

6. 动物

给定你三个葡萄牙语单词,这些词将根据下表从左到右定义一个动物。


请你确定并输出这个动物的名称。


输入格式

根据上表,输入包含三个单词,每行一个,用以识别动物,单词由小写字母构成。

输出格式

输出识别出的动物的名称。

输入样例:

vertebradomamiferoonivoro
复制代码

输出样例:

homem
复制代码

代码

#include <cstdio>#include <iostream>using namespace std;int main(){    string str[3];    string judge;    for(int i=0;i<3;i++)    {        cin >> str[i];        judge +=str[i][0];    }    if(judge == "vac") cout<<"aguia";    if(judge == "vao") cout<<"pomba";       if(judge == "vmo") cout<<"homem";      if(judge == "vmh") cout<<"vaca";       if(judge == "iih") {        if(str[2]=="hematofago") cout<<"pulga";        else cout<<"lagarta";    }        if(judge == "iah") cout<<"sanguessuga";    if(judge == "iao") cout<<"minhoca";          return 0;}
复制代码

总结

本题的进阶做法的关键点在于字符串拼接,以及如何实现 string 类型的首字母拼接。


  • string 定义 str[3]字符串数组,然后用 for 循环接受输入

  • string 定义拼接字符串数组,采用+=的方式拼接。

  • 取首字母时可以想为 str 二维数组中的一项,由于 str 类型的变量也可以看作 char 类的数组,因此可以取具体某一项 str 中的第一个元素。

7. 三角形类型

读取表示三角形三条边的 33 个浮点数 A,B 和 C 并按降序排列,使 A 边是三边中最大的一边。


接下来,根据以下情况,确定它们可以组成的三角形类型:


  • 如果 A≥B+C,则说明三条边不能构成三角形,请输出:NAO FORMA TRIANGULO

  • 否则,说明三条边可以构成三角形,然后按如下情况输出:

  • 如果 A2=B2+C2,请输出:TRIANGULO RETANGULO

  • 如果 A2>B2+C22,请输出:TRIANGULO OBTUSANGULO

  • 如果 A2<B2+C2,请输出:TRIANGULO ACUTANGULO

  • 如果三个边长度都相同,请输出:TRIANGULO EQUILATERO

  • 如果只有两个边长度相同而第三个边长度不同,请输出:TRIANGULO ISOSCELES

输入格式

共一行,包含三个浮点数 A,B,C。

输出格式

输出 A,B,C 组成的三角形的类型。


注意,上述条件可能满足不止一条,这种情况下将所有类型名称,按题目介绍顺序输出,每行输出一条。

数据范围

0<A,B,C≤10.0

输入样例:

7.0 5.0 7.0
复制代码

输出样例:

TRIANGULO ACUTANGULOTRIANGULO ISOSCELES
复制代码

代码

#include <iostream>using namespace std;    double a,b,c;int main(){    cin>>a>>b>>c;    if (a < b) swap(a, b);    if (a < c) swap(a, c);    if (b < c) swap(b, c);        if(a>=b+c)cout<<"NAO FORMA TRIANGULO"<<endl;    else     {    if(a*a==b*b+c*c)cout<<"TRIANGULO RETANGULO"<<endl;    else if(a*a>b*b+c*c)cout<<"TRIANGULO OBTUSANGULO"<<endl;    else if(a*a<b*b+c*c)cout<<"TRIANGULO ACUTANGULO"<<endl;    if(a==b&&b==c)cout<<"TRIANGULO EQUILATERO";    else if(a==b&&b!=c||a!=b&&b==c)cout<<"TRIANGULO ISOSCELES";    }    return 0;}
复制代码

总结

此题容易忽略题目最初的条件,边的长度必须按降序排列,具体的排序过程可以采用 swap 函数实现,基本思路是先保证 a>b,再保证 a>c,使 a 为最大值,再保证 b>c 即可。在题目条件中多个判断条件之间需要注意是否存在同级关系。




专题往期合集:每日算法题解

发布于: 18 小时前阅读数: 7
用户头像

timerring

关注

还未添加个人签名 2022.07.14 加入

还未添加个人简介

评论

发布
暂无评论
每日算法刷题Day2-向上取整、三角形条件、字符串拼接匹配、三数排序思路_算法_timerring_InfoQ写作社区