精华内容
下载资源
问答
  • 问题描述:输入三角形三边长a,b,c(保证能构成三角形),输出三角形面积。输入:一行三个用一个空格隔开的实数a,b,c,表示三角形的三条边长。输出:输出三角形的面积,答案保留四位小数。样例输入3 4 5,样例输出6....

    问题描述:

    输入三角形三边长a,b,c(保证能构成三角形),输出三角形面积。

    输入:一行三个用一个空格隔开的实数a,b,c,表示三角形的三条边长。

    输出:输出三角形的面积,答案保留四位小数。

    样例输入3 4 5,样例输出6.0000。

    数据范围限制:1<=a,b,c<=10000

    ———————————————————————————

    问题分析:

    数学基础:

    已知三角形的三边,计算三角形面积,需要用到海伦公式:

    223df56f1830a7a150b6505672e1685a.png

    即p=(a+b+c)/2

    算法:

    输入三个边长,套用海伦公式计算面积,并输出。 

    可以先判断是否可以构成三角形,即任意两边之和大于第三边,可以构成三角形情况下再计算,可以增加严谨性。

    _____________________________________________________________

    代码:

    #include 

    #include 

    int main()

    {

        printf("请依次输入三个边长\n");

       double a,b,c,p,s;

        scanf("%lf%lf%lf",&a,&b,&c);

        if(a+b>c && a+c>b && b+c>a) //判断是否可以构成三角形。

        {

              p=(a+b+c)/2;//计算半周长

            s=sqrt(p*(p-a)*(p-b)*(p-c));//套用海伦公式,计算面积

              printf("面积为%lf\n", s);//输出结果

        }

        else printf("无法构成三角形\n");//输入不合法,提示。

        return 0;

    }

    你有其他的算法吗,欢迎留言区讨论!

    展开全文
  • 本文主要研究:给定三角形三个顶点 A、B、C 的坐标,以及点 P 的坐标。如何根据它们判断点 P 是否三角形内部?四个点的坐标已知,如何判断 P 是否三角形内部?关键词:重心坐标,Barycentric coordinate system...

    在计算机图形学中,渲染图片时,会利用图形的顶点把其表面划分成一个个的小三角形,然后再在三角形内部做线性插值,算出图形表面任意点的坐标、颜色等等。

    本文主要研究:给定三角形三个顶点 A、B、C 的坐标,以及点 P 的坐标。如何根据它们判断点 P 是否在三角形内部?

    24ec6e043a381147111655891d97eefd.png
    四个点的坐标已知,如何判断 P 是否在三角形内部?

    关键词:重心坐标,Barycentric coordinate system

    参考资料:https://blackpawn.com/texts/pointinpoly

    Same Side Technique

    最容易想到的方法是:把点 P 和 A、B、C 连起来,然后分别计算

    的夹角,如果它们的和恰好为
    ,那么点 P 就在三角形内部,反之则在其外部。但是这种方法很慢,而且涉及到求反三角函数,所以直接被淘汰。

    还有一种方法,是判断点 P 在线的哪一边。如果同时满足:

    • 点 P 和 C 在直线 AB 的同侧
    • 点 P 和 A 在直线 BC 的同侧
    • 点 P 和 B 在直线 AC 的同侧

    则点 P 显然就在

    内部。

    数学上如何判断两个点在直线同侧呢?以 P 、C 在 AB 同侧为例,只需

    方向相同即可。例如上图中两个叉乘的方向都指向屏幕外。

    转化成伪代码如下所示:

    function SameSide(p1, p2, a, b)
        cp1 = CrossProduct(b-a, p1-a)
        cp2 = CrossProduct(b-a, p2-a) 
        if DotProduct(cp1, cp2)>=0 then return true
        else return false 

    上面的伪代码用于判断 p1,p2 两个点,是否在 a 与 b 连线的同侧。

    那么,相应的判断点是否在三角形内部的算法,也显而易见了:

    function PointInTriangle(p, a, b, c)
        PC = SameSide(p, c, a, b) # p 和 c 在 ab 的同侧
        PA = SameSide(p, a, b, c) # p 和 a 在 bc 的同侧
        PB = SameSide(p, b, a, c) # p 和 b 在 ac 的同侧
        return PA and PB and PC

    上述算法很简单且易于实现,但效率还不算太高,下面引入本文主角——重心坐标。

    Barycentric Technique

    3f242b2ecdcda7580825019dd111e37c.png

    为了方便表达,令

    这两个非零且不共线的向量可以作为一组基底,表达该三角形所在平面内的任意点。

    因此我们可以令:

    要想让 P 在

    内部,必须要满足:
    • (反推法,取 BC 上一点 p'= v0+λ(v1-v0),那么 u=(1-λ) v=λ,u+v=1)

    下一步是解出 u 和 v。

    (1) 两侧同时点乘

    (1) 两侧同时点乘

    由于四个坐标都是已知的,因此

    都是已知的。因此 (2) 和 (3) 构成了一个二元一次方程组。

    解得(为了整洁,下面的公式去掉了

    的向量符号):

    发现这俩的分母相同,因此又可以节省很多计算。下面是伪代码:

    function PointInTriangle(p, a, b, c)
        // 计算向量
        v0 = c-a
        v1 = b-a
        v2 = p-a
        
        // 计算点乘
        dot00 = dot(v0, v0)
        dot01 = dot(v0, v1)
        dot02 = dot(v0, v2)
        dot11 = dot(v1, v1)
        dot12 = dot(v1, v2)
    
        // 计算重心坐标系下的坐标
        invDenom = 1/(dot00 * dot11 - dot01 * dot01)
        u = (dot11 * dot02 - dot01 * dot12) * invDenom
        v = (dot00 * dot12 - dot01 * dot02) * invDenom
        
        return u>=0 and v>=0 and (u+v)<1 

    我们把上述算法和第一节中的 Same Side Technique 对比一下。

    对于三维向量:

    点乘:3 个乘法 + 2 个加法

    叉乘:6 个乘法 + 3 个加法

    向量相加减:3个加法

    因此,对于 SameSide Technique,判断一次 SameSide 需要做 15次乘法和 20 次加法(20次是伪代码的加法数,可以稍微优化一下,在函数外事先求好向量,但能省下的运算也很有限),三次 SameSide 完成判断,所以总共用了 45 个乘法,60 次加法。

    对于 Barycentric Technique,数了一下共用了 23 次乘法,1次除法(似乎精度不高时乘法和除法效率差不多), 22 次加法,显然 Barycentric Technique 效率更高。

    ******************************************************************************************

    根据大佬@TM Zhang 的评论,这里用星号分割线更新一下。上文中的 SameSide 算法重复计算了很多次叉乘,原始伪代码需要计算:

    ,

    ,

    ,

    而三角形中,任意两条边的叉乘大小为三角形的面积的两倍,方向由右手螺旋定则判断。由此可以发现,

    大小方向均相同,因此只需要计算第一个就好了。

    即,只需要计算:

    ,
    ,

    如果上面这四个叉乘方向相同,则 P 在三角形内部。

    1a678a5bc972697eddbc0cd18e9ab92f.png

    我们希望用前三个叉乘中的元素,表示最后一个叉乘中的元素:

    因此只要前三个叉乘方向相同,它们之和的方向一定与它们相同,最终 SameSide Technique 化简为求三个叉乘:

    ,
    ,

    改进过的 SameSide Technique 伪代码如下:

    function PointInTriangle(p, a, b, c)
        AP = p-a
        AB = b-a
        BP = p-b
        BC = c-b
        CP = p-c
        CA = c-a
    
        APxAB = CrossProduct(AP, AB)
        BPxBC = CrossProduct(BP, BC)
        CPxCA = CrossProduct(CP, CA)
        
        dot1 = DotProduct(APxAB, BPxBC)
        dot2 = DotProduct(BPxBC, CPxCA)
        
        return dot1>=0 and dot2>=0
    

    改进后的 SameSide Technique 需要31次加法,24次乘法,还是比不上 Barycentric Technique 的22次加法,24次乘法。虽然这俩看上去也没差多少,但是在计算机图形学中,一个物体表面可能有成千上万乃至几十万个小三角形,而每个小三角形中,又有几十上百个需要判断的点,即使是微弱的优势,也会被放大百万倍,不可轻视。但是评论区另有大佬指出,barycentric technique 需要计算除法,会对精度造成负面影响。

    ******************************************************************************************

    为什么叫 Barycentric Technique

    现在再回到 (1):

    3f242b2ecdcda7580825019dd111e37c.png

    将向量换回点的坐标相减的形式:

    合并同类项得:

    这种形式下,就立刻看出为啥这个方法叫 Barycentric Coordinate 了,即:可以把 P 看成 A、B、C 三个顶点的加权平均。P 离哪个点越近,该点的权重就越接近 1;如果三个顶点的权重都是 1/3,P 就是三角形的重心。

    它也可以用于计算三角形内任何一点的颜色,例如在做渲染时,已知三角形三个顶点的颜色,那么它内部任何一点的颜色,就是三个顶点颜色的加权平均,权重如公式 (5) 所示。

    在判断遮挡关系的 z-buffer 算法中,希望求出图片上每个像素点的深度,此时也需要用到 (5):

    我们很容易知道图片上某个像素点的横、纵坐标。那么就可以把它所在的小三角形三个顶点的横、纵坐标,代入公式 (5) 联立求出 u、v 的值:虽然有三个坐标,但公式 (5) 只有两个未知数,因此知道横、纵坐标足以解出 u 和 v。求解的算法还是 Barycentric Technique 的伪代码,只不过此时传入的都是去掉 z 坐标的二维点。

    三个顶点的 z 值是知道的,结合刚刚求出的 u、v 值,再代回 (5) 就求出了该像素点的 z 值。

    后记

    我是图形学的外行,本来这就是一篇学习笔记/备忘录,没想到在和评论区的很多大神的讨论中,学习到那么多新东西,感谢!

    展开全文
  • 第一个完美:6,第二个完美:28,第三个完美:496,第四个完美:8128,第五个完美:33550336,.......2 探索在茫茫海中,第五个完美(33550336)要大得多,居然藏在千万位数的深处!它在十五世纪被人们...

    完美数

    完美数(perfect number,又称完全数)指,它所有的真因子(即除了自身以外的因子)和,恰好等于它自身。

    第一个完美数:6,

    第二个完美数:28,

    第三个完美数:496,

    第四个完美数:8128,

    第五个完美数:33550336,

    .......

    2 探索

    在茫茫数海中,第五个完美数(33550336)要大得多,居然藏在千万位数的深处!它在十五世纪被人们发现,计算机问世后,借助这一有力工具,数论爱好者们继续探索。

    笛卡尔曾公开预言:“能找出的完美数是不会多的,好比人类一样,要找一个完美人亦非易事。”

    时至今日,人们一直没有发现有奇完美数的存在。于是是否存在奇完美数成为数论中的一大难题。只知道即便有,这个数也是非常之大,并且需要满足一系列苛刻的条件。

    经过不少数学家研究,到2013年为止,一共找到了48个完美数。

    3 有趣性质

    1. 目前发现的完美数都是以6或8结尾,会不会有奇完全数存在?如果存在,它必须大于10^300,至今无人能回答这些问题。

    2. 所有的完美数都是三角形数。例如:

    6=1+2+328=1+2+3+...+6+78128=1+2+3…+126+127

    3. 所有完美数的倒数都是调和数。例如:

    1/1+1/2+1/3+1/6=2

    1/1+1/2+1/4+1/7+1/14+1/28=2

    1/1+1/2+1/4+1/8+1/16+1/31+1/62+1/124+1/248+1/496=2

    4. 可以表示成连续奇立方数之和。除6以外的完全数,都可以表示成连续奇立方数之和,并规律式增加。例如:

    28=1³+3^3

    496=1^3+3^3+5^3+7^3

    8128=1^3+3^3+5^3+……+15^3

    33550336=1^3+3^3+5^3+……+125^3+127^3

      4 判断

    如何判断是为否完美数呢?在计算机数值型可以表达的的范围内,我们可以尝试找一找。

    这是一道leetcode题(No.507),我前段时间写过一个解,在leetcode平台上已通过:

    class Solution:    def checkPerfectNumber(self, num: int) -> bool:        sum = 1        tmp = num        if num == 0 or num==1:            return False        while num%2 == 0:            num /= 2            sum += num+tmp/num        return sum==tmp

    已知完美数都以6或8结尾,所以才有了上面的方法,注意这不是寻找一个数所有因子的方法。使用6或8结尾这个小trick,实现更高效( > 95.26%),但不严谨。

    5e1a5cb2c10bc4396799958d638fca09.png

    很遗憾,今天我发现这是一个错误的解法,虽然在Leetcode上已经通过。原因如下,我们试图打印尽可能多的完美数:

    import sysif __name__ == "__main__":    s = Solution()    i,j = 0,0    while(i        isPerfect = s.checkPerfectNumber(i)        if isPerfect is True:            j+=1            print("第%d个完美数: %d"%(j,i))        i+=1

    第1个完美数: 6

    第2个完美数: 28

    第3个完美数: 120

    第4个完美数: 496

    第5个完美数: 2016

    第6个完美数: 8128

    第7个完美数: 32640

    第8个完美数: 130816

    第9个完美数: 523776

    第10个完美数: 2096128

    很明显,120不是一个完美数,因此,可以确定Leetcode平台遗漏了这些cases,已经将此问题提交到Leetocode,如下所示:

    e8899066b672f07220b1708c21511428.png

    5 正解

    如果遍历所有的小于num的数,check是否为其因子,时间复杂度为o(n),在平台上提交会超时。

    一种更好的解法,时间复杂度为O(sqrt(n)), 因为num的两个因子:num_i和num_j,假设num_i < num_j ,则 num_i 的最大值为 sqrt(num), 所以我们只需要遍历到sqrt(num)即可。

    代码如下:

    class Solution:    def checkPerfectNumber(self, num: int) -> bool:        if num <= 0:            return False                i, sum = 1, 0        while i*i <= num:            if num % i == 0:                sum += i            if i*i != num:                sum += num / i            i += 1                    return sum - num == num 

    6 更多完美数

    6. 8,589,869,0567. 137,438,691,3288. 2,305,843,008,139,952,128

    9. 2,658,455,991,569,831,744,654,692,615,953,842,17610. 191,561,942,608,236,107,294,793,378,084,303,638,130,997,321,548,169,21611. 13,164,036,458,569,648,337,239,753,460,458,722,910,223,472,318,386,943,117,783,728,12812. 14,474,011,154,664,524,427,946,373,126,085,988,481,573,677,491,474,835,889,066,354,349,131,199,152,128

    …………47 ……2^42643800 X (2^42643801-1)48 ……2^57885160 X (2^57885161-1)由于后面数字位数较多,例子只列到12个,第13个有314位到第39个完全数有25674127位数,据估计它以四号字打出时需要一本字典大小的书。

    推荐阅读:

    如何拿下10个算法工程师offer,不可错过!

    Python数据分析学习路线个人总结

    面经:L1和L2正则

    45f7c0e1aa585a6c39a3c084d3e1b0a3.png

    Python与算法社区

     点个好看

    展开全文
  • """不判断三条边是否可以组成三角形,直接求该三角形的面积。import matha = float(input(" 请输入三角形第一条边长a:"))b = float(input(" 请输入三角形第二条边长b:"))c = float(input(" 请输入三角形条边长...

    23df0be4fa41d616df096056dcd6744d.png

    """不判断三条边是否可以组成三角形,直接求该三角形的面积。import matha = float(input(" 请输入三角形第一条边长a:"))b = float(input(" 请输入三角形第二条边长b:"))c = float(input(" 请输入三角形第三条边长c:"))p = (a+b+c)/2 # 海伦公式D = p*(p-a)*(p-b)*(p-c)S = math.sqrt(D) # 已知三角形三边a,b,c,则S=sqrt[p(p-a)(p-b)(p-c)]print("该三角形的面积为:%.2f" % S)"""
    # 先判断输入的三条边是否可以构成一个三角形,如果可以构成再进行求解。
    import math
    def is_triangle(a=0, b=0, c=0):
    Q = [a, b, c]
    Q.sort() # 升序排序
    if Q[2] < Q[1] +Q[0]:
    p = (a + b + c) / 2 # 海伦公式
    D = p * (p - a) * (p - b) * (p - c)
    S = math.sqrt(D) # 已知三角形三边a,b,c,则S=sqrt[p(p-a)(p-b)(p-c)]
    print("该三角形的面积为:%.2f" % S)
    else:
    print("该三条边长无法构成一个三角形")
    def triangle(e):
    a = float(input("请输入三角形第一条边长:"))
    b = float(input("请输入三角形第二条边长:"))
    c = float(input("请输入三角形第三条边长:"))
    e(a, b, c)
    triangle(is_triangle)

    展开全文
  • 线条是图形最主要的构成要素,也是涉及考点最多的一要素。图形推理题主要从直线和曲线两方面来考查。另外,还有一与线条相关的概念笔画,也是重要的考点。1.直线和曲线直线图形即完全由直线构成的图形。例如...
  • 三角形是数学中最常研究的图形,也是几何图形中的常考点之一,下面我们先来简单了解下初中数学中三角形的构建:三角形边关系三角形三边的关系,是在学生初步了解了三角形的定义的基础上,进一步研究三角形的特征...
  • 扫码求助天津小粉笔即刻领·天津市考大礼包各位小伙伴在近两年市考中图形推理一直稳定在5道题这部分题型难点在于是否能迅速找到相应的规律接下来小粉笔带你了解图形部分题型判断+解题方法(收藏哟)图形推理:位置类、...
  • 有效三角形的个数)https://leetcode-cn.com/problems/valid-triangle-number/题目描述给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。示例1:输入:[2,2,3,4]输出:3解释:有...
  • 1.本程序功能:随意输入三个数值,程序可判断是否可组成三角形:(1)若三个数中任意数小于等于0,程序输出“输入错误,请重新输入:”(2)若三个数均大于0,但不组成三角形,则输出“无法构成三角形”(3)若...
  • 三角形边的关系的应用 ①判定三条线段是否构成三角形; ②已知两边的长,确定第边的取值范围; ③可证明线段之间的不等关系. 注:方法技巧 ①判断给定的三条线段能否组成三角形,只需判断两条较短线段的和是否...
  • 判断推理 第一章 图形推理 常见考题形式:一组图:顺着各个图形往下看,一般都是五幅图以上;两组图:第一组找规律,第二组运用规律(注意规律尽量大); 九宫格:优先考虑横竖; 中间图形比较特殊,考虑米字; 不要...
  • 其包括点在三角形内外,多边形内外判断,平面剖分中的位置等。关于出现在这篇文章中但没有给出的自定义函数,如: 等,上篇博客有提到,向量叉乘。判断是否在线上:我们可以用刚刚我们提到...
  • 从键盘上输入三个数判断能否构成三角形,如不,给出提示;如,求出对应三角形的面积,并判断该三角形是锐角三角形还是钝角三角形还是直角三角形,输出对应结论。 #include<stdio.h> #include<math.h&...
  • 编写函数,判断输入的三个数字是否能构成三角形的三条边。 代码段: def triangle(a,b,c): if a <= 0 or b <= 0 or c <= 0: print('三角形的三边必须是大于0的') elif a + b <= c or b + c <= a...
  • #include #include int mian() { float a,b,c; scanf("%f%f%f",&a,&b,&c); if((a+b)>c&&(a+c)>b) ... else if(fabs(a*a+b*b-c*c)||fabs(a*a+c*c-b*b)||fabs(b*b+c*c-a*a)) ... printf("不能构成三角形"); }
  • 在三角形计算中,要求三角形的三个边长:A B C 。1、 当三边不可能构成三角形时提示错误,可构成三角形时计算三角形周长。2、若是等腰三角形打印“等腰三角形”, 若两个等腰的平方和等于第三边平方和,则打印“等腰...
  • 大家好,我是JRVS创意总监,根据我自己多年以来的设计经验与体会,现在与大家分享以下三个设计观点。一、美的计量,从抽象到逻辑。设计图片我认为,美有两个定义。第一个是,你觉得它美它就美。第二个是,符合的...
  • 三角形三边关系应用广泛,利用边关系可以判断三条线段能否组成三角形、已知两边求第边的长或取值范围、说明线段不等关系、化简绝对值、求解等腰三角形的边长及周长等。下面我们将举例子说明。三角形三边关系是:...
  • 而颜色,对于计算机来说,正是用数表示的,草莓图片中彩色的颜色是红绿蓝三种色光,各自有一个数,总共三个数;而手写数字都是黑白的,只要一个数,0表示纯黑色,255表示纯白色,两者中间的数则是灰色,数字越小...
  • int main() { else: Function TheMax(num1,num2,num3) dim temp if num1-num2>0 then temp=num1 elseif num1-num2不能组成三角形" else: break 扩展5261资料: 3整数,判断是否能构成三角形可以根4102据数学公式...
  • 哈喽,大家好!我们又见面了,欢迎继续关注【轩爸...要点诠释:(1)理论依据:两点之间线段最短.(2)边关系的应用:判断三条线段能否组成三角形,若两条较短的线段长之和大于最长线段的长,则这三条线段可以组成三角...
  • print('三角形边必须是大于0的') elif a + b print('两边之和大于第边') else: print('输入的三条边符合组成三角形的编程规则!') a=float(input('请输入边长 a:')) b=float(input('请输入边长 b:')) ...
  • 2020版人教版八上数学第十一章《三角形》辅导(2)三角形两边的和大于第边一、两点之间线段最短我们知道,两点的所有连线中,线段最短.简单说成:两点之间,线段最短.如图,从A地到B地有4条道路,它们都不是最短...
  • y,z = eval(str) min_value=min(x,y,z) max_value=max(x,y,z) if min_value(x+y+z)>2*max_value: print u"能组成三角形" else: print u"不能组成三角形" else: break 扩展资料: 3整数,判断是否能构成三角形可以...
  • 输入三个数判断是否能构成三角形 能构成三角形三边关系: 三边都大于零 两边之和大于第三边,两边之差小于第三边 """ import random def makeUpTriangle(): borderA=float(input("请输入三角形的第一条边长大小:...
  • 给出三个数判断是否能构成三角形 import java.util.Scanner; public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println(“输入三个正整数”); int a = s.nextInt(); ...
  • 写一个方法void sanjiao(int a,int b,int c),判断三个参数是否能构成一个三角形,如果不能则抛出异常IllegalArgumentException,显示异常信息“a,b,c不能构成三角形”,如果可以构成则显示三角形三个边长,在主方法...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
关键字:

判断三个数是否能构成三角形