原题传送门:
https://www.luogu.com.cn/problem/P2181
题目描述
对于一个 nn 个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出图形中对角线交点的个数。
例如,6 边形:
输入格式
输入只有一行一个整数 n,代表边数。
输出格式
输出一行一个整数代表答案。
输入输出样例
输入
3
输出
0
输入
6
输出
15
说明/提示
数据规模与约定
- 对于 50% 的数据,保证 3≤n≤100。
- 对于 100% 的数据,保证 3≤n≤100000。
解题的思路:
先得到几个简单的数据,从中得到规律:
当4条边数,交点为1个(此时我大胆的猜想是
C
4
4
C_4^4
C44得出的);
当5条边数,交点为5个(此时我大胆的猜想是
C
5
4
C_5^4
C54得出的);
当6条边数,交点为15个(此时我大胆的猜想是
C
6
4
C_6^4
C64得出的)
然后开始写了。
代码1:
(感觉能过,在测试n=100000时,没报错,放上去报错了,断点测试发现,最后的答案被割下了好几位)
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
cout << n * (n - 1) * (n - 2) * (n - 3) / 24;
return 0;
}
代码2(改进了n的类型,这是我那是知道的最大的整形范围):
(还是感觉能过,在测试n=100000时,没报错,放上去报错了,断点测试发现,最后的答案也被割下了好几位)
#include<iostream>
using namespace std;
int main() {
long long n;
cin >> n;
cout << n * (n - 1) * (n - 2) * (n - 3) / 24;
return 0;
}
代码3(再次改进了n的类型,这是从网上看到的):
(还是感觉能过,在测试n=100000时,没报错,放上去报错了,断点测试发现,最后的答案也被割下了好几位)
#include<iostream>
using namespace std;
int main() {
//unsigned long long表示无符号长整型
unsigned long long n;
cin >> n;
cout << n * (n - 1) * (n - 2) * (n - 3) / 24;
return 0;
}
代码4(改进了输出方式):
(这次,终于AC过了)
(发现当n=100000时,远远超过了unsigned long long的最大范围)
#include<iostream>
using namespace std;
int main() {
unsigned long long n;
cin >> n;
cout << n * (n - 1) / 2 * (n - 2) / 3 * (n - 3) / 4;
return 0;
}
最后,发现cout输出范围是根据所用的变量的范围定的
如n为int,则cout << n * (n - 1) * (n - 2) * (n - 3) / 24;
得到就是在int的范围内
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教 。