c手记2 【《算法竞赛入门经典第二版》习题1-6三角形与1-7闰年】

这几天学c感觉不太费力,所以在CSDN上发几篇博客,我会做非常详细的讲解,希望对您有用!


习题1-6 三角形(triangle)

习题内容
输入三角形3条边的长度值(均为正整数),判断是否能为直角三角形的3个边长。如果可以,则输入yes,如果不能,则输出no。如果根本无法构成三角形,则输出not a triangle


注意,三角形的三条边分别以a,b,c代替

解题思路

首先根据题干给出的第一个条件(是否能为直角三角形的3个边长)来写出第一段伪代码。要想判断我们需要两个重要条件——

  • 因为直角三角形的斜边长度大于其他两边,所以我们在判断直角三角形时也要判断这个。
  • 根据勾股定理:直角三角形的斜边的平方=两边的平方的和。也就是——a*a+b*b=c*c
    于此,根据这两个定理我们可以写出此三段代码:
if(a < c && b < c && a*a+b*b == c*c)printf("yes\n");
if(c < a && b < a && c*c+b*b == a*a)printf("yes\n");
if(a < b && c < b && c*c+b*b == a*a)printf("yes\n");

然后我们还要看题干的第二个条件(如果根本无法构成三角形),我们知道,判断能否构成三角形有两条定理

  1. 三角形两条边之和大于第三边
  2. 三角形两条边之差小于第三边
    但我们要判断的是无法构成三角形,所以我们要逆推三角形定理!
    于此,根据两条定理逆推我们可以写出此一段代码:
if(a+b < c || a+c < b || c+b < a || a-b > c || b-c > a || a-c > b)printf("not a triangle");

注意:||符号是“或”的意思,只要一个是真的,那么后面就不执行了,只执行后面的语句
最后,到了最后一个条件(如果可以,则输出yes,如果不能,则输出no)。千万不要认为这个很简单,一开始我在if语句后面加else语句再加输出no却直接输出了no,造成“不管输入什么,只要错了,我都要输出no的场景”, 害我捣鼓了一天,最后我发现让这个输出no自成一句比较好,于此此段代码诞生了:

if(a*a+b*b != c*c && c*c+b*b != a*a && c*c+a*a != b*b && a > c && b > c && c > a && b > a && a > b && c > b)printf("no\n");

此行代码的通俗意思就是“勾股定理不符合,直角三角形定理也不符合的三条边,直接给人输出no吧!”
好了。习题1-6三角形完成!
然后我整理一下代码(都是能运行的代码)

#include<stdio.h>
int main()
{
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    if(a+b < c || a+c < b || c+b < a || a-b > c || b-c > a || a-c > b)printf("not a triangle");
        if(a < c && b < c && a*a+b*b == c*c)printf("yes\n");
        if(c < a && b < a && c*c+b*b == a*a)printf("yes\n");
        if(a < b && c < b && c*c+b*b == a*a)printf("yes\n");
        if(a*a+b*b != c*c && c*c+b*b != a*a && c*c+a*a != b*b && a > c && b > c && c > a && b > a && a > b && c > b)printf("no\n");
    return 0;
}

习题1-7年份(闰年)

习题内容
输入年份,判断是否为闰年。如果是,则输出yes,否则输出no。


解题思路

判断是否为闰年有三种:

  1. 能被4整除,但不能被100整除
  2. 能被400整除
  3. 能被3200和172800整除
    那么我们整理一下头绪,写个if语句:
if(y%4 == 0 && y%100 != 0 || y%400 == 0 || y%172800 == 0 && y%3200 == 0)printf("yes\n");

其次,怕有人搞坏,我们要建立个if语句,让用户持续输入,因为有些人会将年份写成负数

  if(y < 0)
    printf("年份输入有误,应输入正整数!\a\n");

于此整理一下

#include<stdio.h>
int main()
{
    int y
    scanf("%d", &y);
    if(y < 0)
        printf("年份输入有误,应输入正整数!\a\n");
    if(y%4 == 0 && y%100 != 0 || y%400 == 0 || y%172800 == 0 && y%3200 == 0)printf("yes\n");
    else
        printf("no\n");
    return 0;
}

此习题也完成了!
有什么疑问可以加qq1693121186或qq群779563507

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值