c语言判断三角形_C语言解决数学问题

如图,从9个单位小方格组成的3x3方格表的16个顶点中任取三个顶点,则这三个顶点组成的直角三角形有几个

00975ff01a25ce1bf5ed5ad8e1bb33bf.png

考虑此问题,我们用C语言暴力解决。用C语言解决该问题要与数学知识结合起来。

穷举思路,如图,以A点为起始点,B点为第二个点,C作为第三个点起始点开始循环,一直到P点结束。然后,第二个点往后移,第三个点起始点变为D点,重复循环。当第二个点在O处时,下一轮第一个点该往后移,所以要设置三层循环。

d1245dbe1bf0149058ad6ed88b15c47f.png

宏定义

#define SIZE 4//点的总数
#define SIZEX 2//横向点的个数

循环

for (i = 0; i < SIZE; i++) {
		for (j = i + 1; j < SIZE; j++) {
			for (k = j + 1; k < SIZE; k++) {
				if (triangles(i, j, k) == 1 || sjx(i, j, k) == 2) {
					num++;
				}
				if (triangles(i, j, k) == 2) {
					num1++;
				}
			}
		}
	}

triangles函数部分

int triangles(int i, int j, int k)
{
	int ax, bx, cx, ay, by, cy;
	int a1, a2, a3, b1, b2, b3;
	int m1, m2, m3;
	double k1, k2, k3;
	ax = (i + SIZEX) % SIZEX;//横坐标
	bx = (j + SIZEX) % SIZEX;
	cx = (k + SIZEX) % SIZEX;
	ay = i / SIZEX;
	by = j / SIZEX;
	cy = k / SIZEX;
	a1 = ax - bx;
	b1 = ay - by;
	a2 = ax - cx;
	b2 = ay - cy;
	a3 = bx - cx;
	b3 = by - cy;
	if (a1 * b2 - a2 * b1 == 0 || a1 * b3 - a3 * b1 == 0 || a3 * b2 - a2 * b3 == 0) return 0;
	else if (a1 * a2 - b1 * b2 == 0 || a1 * a3 - b1 * b3 == 0 || a2 * a3 - b2 * b3 == 0) return 2;
	else return 1;
}

重点在于函数部分,观察规律可得各个点的横坐标满足(i + SIZEX)% SIZEX,纵坐标满足i / SIZEX,有了坐标,就可以判断三个点围成的形状。

我一开始想用斜率的方法来判断平行和直角,但是发现斜率有不存在的情况,所以就用了向量的方法判断。

a1 * b2 - a2 * b1 ==0|| a1 * b3 - a3 * b1 ==0|| a3 * b2 - a2 * b3 ==0判断的是三个点是否成三角形,原理是向量的平行定理。

a1 * a2 - b1 * b2 ==0|| a1 * a3 - b1 * b3 ==0|| a2 * a3 - b2 * b3 ==0向量相乘为0表示垂直

运行结果

93bbb3a6a7887ca28032c8f86ba2dcd5.png

其中172为直角三角形的个数,516为三角形的总数。

用数学方法验证是否正确。因为矩形可以分割为四个不同的三角形,所以,计算矩形个数再乘四就为直角三角形个数。

9ad0e98bcf8a65e4bcb3f78a4da15fc0.png
第一种类型

有9个

066e9bb4ec5735f18135af3176dea12e.png
第二种类型

有6个

a34c61d2dd217df91dcb1e094198dd66.png
第三种类型

有6个

dce6f4bbc328c599ca5c4aafe60592ee.png
第四种类型

有三个

26cdef3ac4a02cea62ad1eb70b118c2a.png
第五种类型

有三个

2240ccc61136055f360a0a7e935c7d09.png
第六种类型

有四个

579a32ebf742bf9fe8fd6ae683bbfc1b.png
第七种类型

有一个

09bac23f55069553c462efc0a68d7a0c.png
第八种类型

有四个

33c8235d93457d23c75a3ff537922694.png
第九种类型

有两个

671170f28474024337216897dd788d87.png
第十种类型

有一个

b849af94942dddb46b5a244d19509e36.png
第11种类型

有2个

329ef042c39ec95f74127b91e4831a08.png
第12种类型

有两个

总共有43个矩形,所以直角三角形为172个,与计算机得出结果相同。

此外可以改变SIZE和SIZEX的值来求其他情况三角形的个数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值