首页 » 技术分享 » N顶点凸多边形中对角线交点的个数

N顶点凸多边形中对角线交点的个数

 

题目描述
对于一个N个定点的凸多边形,他的任何三条对角线都不会交于一点。请求楚图形中对角线交点的个数。

例如,6边形:
在这里插入图片描述
我们可以发现,两条不平行对角线才会有一个交点,同时,两条对角线又确定了一个四边形,也就是确定了4个顶点。如果我们确定了4个顶点的组合方式,我们也就能确定有多少个四边形,进而确定有多少个对角线交点。用排列组合的计算公式就是
在这里插入图片描述
即N*(N-1)(N-2)(N-3)/(4321)
考虑到如果初始N很大时,上面结果会超级大,可以改写成N
(N-1)/2*(N-2)*/3(N-3)/4

那为什么这样一定是对的呢?难道不会因为除不尽却向下取整而导致错误吗?

事实上是一定除得尽的

首先n和n-1一定有一个是2的倍数,因此2可以除尽,

同理n,n-1,n-2中一定有一个是3的倍数,因此3可以除尽(除掉2只会消除因数2而对3没有影响)

同理4也可以除尽
用C语言描述就是:

#include<stdio.h>

int main()
{
	unsigned long long n;
	scanf("%lld",&n);
	if(n<=3)
		printf("0\n");
	else
		printf("%lld\n",n*(n-1)/2*(n-2)/3*(n-3)/4);
	return 0;
}


(此代码在VC++6.0中无法运行,会出现error C2632: ‘long’ followed by ‘long’ is illegal
原因:

因为 VC6中所使用的编译器是C90标准的,而 long long 型是在C99中新加入的

(longlong int双长整型是C 99扩充的数据类型,同时扩充的还有float_complex,double_complex,long

long_complex,bool等),故无法实现编译。(——此答案搜索于百度)
VisualC++6.0 环境运行下,将long long 用 _int64 进行替换,则输入输出的格式字符串应该写成%I64d以输入输出long long类型的整数。)

在这里插入图片描述

转载自原文链接, 如需删除请联系管理员。

原文链接:N顶点凸多边形中对角线交点的个数,转载请注明来源!

0