UVa 11401 - Triangle Countin

题目:给你n根长度分别为1,2,..,n的棍子,问能组成多少个不同的三角形。

分析:组合数学,计数原理。本题可以正向求解也可以反向求补集,这里采用正向求解。

            1.首先写出前几组数据,找规律:{ 里面的括号是子情况 }

            (4,3,(2))

            (5,4,(3,2))

            (6,5,(4,3,2))(6,4,(3))

            (7,6,(5,4,3,2))(7,5,(4,3))

            (8,7,(6,5,4,3,2))(8,6,(5,4,3))(8,5,(4))

             对于上述的数据采用记号[a,b,c,...] 记录对应每种的子情况数,则转化如下:

             [1]

             [2]

             [3,1]

             [4,2]

             [5,3,1]

            观察发现,每组中对应的子情况数依次递增1,每当最后的一组变为3时,后面就出现新的组;

            这是因为n的奇偶性不同产生的影响,当最长的边为l时,对应存在的解应该如下:

            (l,l-1,(2))(l,l-2,(3,2)),... ,(l,l-k,(k,..,2))

            无论l的奇偶性,k均取值l/2(这里是整除),因此解的个数与奇偶性相关的;

           2.然后观察计算

           解的个数为:n-3 + n-5 + .. + r;{ n为奇数r为2,n为偶数r为1 }

           分就两种情况求通向公式有:

           f(n)=(n^2 + 4n +4)/ 4 { n为偶数 };f(n)= (n^2 + 4n +3)/ 4 { n为奇数 };

           因为写成程序时是整除运算,所以这里都是用偶数的通项公式没有影响;

           因此有:f(n)= (n^2 + 4n +4)/ 4,为最长边为n时的解的个数,求和输出即可。

说明:注意使用long long类型。

#include <iostream>
#include <cstdlib>

using namespace std; 

long long F[1000001];
long long S[1000001];

int main()
{
	long long temp;
	for (int i = 4 ; i < 1000001 ; ++ i) {
		F[i] = (1LL*i*i-i*4LL+4LL)/4LL;
		S[i] = 0LL+F[i]+S[i-1];
	}
	int n;
	while (cin >> n && n >= 3)
		cout << S[n] << endl;
	
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 根据三角形不等式,我们可以编写一段C语言代码来判断三条线段的长度能否组成三角形,如果不能,则输出No,如果能,请判断此三角形是否为等边三角形,若是则输出E-Triangle,否则输出G-Triangle。以下是编写的C语言程序:#include<stdio.h> int main() { int a,b,c; scanf("%d %d %d",&a,&b,&c); if(a+b>c && a+c>b && b+c>a) { if(a==b && a==c) printf("E-Triangle"); else printf("G-Triangle"); } else printf("No"); return 0; } ### 回答2: 可以通过以下步骤来判断三条线段能否组成三角形,并判断是否为等边三角形: 1. 首先,输入三个整数表示三条线段的长度,分别为a、b和c。 2. 判断三个数是否大于0,若有任一条线段长度小于等于0,则输出"No"。 3. 判断是否满足三角形的三边关系,即任意两边之和大于第三边。若不满足该条件,则输出"No"。 4. 判断是否为等边三角形,若三个数都相等,则输出"E-Triangle";否则,输出"G-Triangle"。 以下是对应的C语言代码实现: ```c #include<stdio.h> int main() { int a, b, c; // 输入三个整数 printf("请输入三个整数,分别表示三条线段的长度:\n"); scanf("%d%d%d", &a, &b, &c); // 判断三角形是否合法 if (a <= 0 || b <= 0 || c <= 0 || (a+b <= c) || (a+c <= b) || (b+c <= a)) { printf("No\n"); } else { // 判断是否为等边三角形 if (a == b && b == c) { printf("E-Triangle\n"); } else { printf("G-Triangle\n"); } } return 0; } ``` 该程序首先通过`scanf`函数输入三个整数,判断是否满足三角形的三边关系,并判断是否为等边三角形,并输出相应结果。 ### 回答3: 可以根据三角形的性质来判断三条线段能否组成一个三角形。三角形的任意两边之和大于第三边,任意两边之差小于第三边。所以我们可以编写一个判断三角形的函数。再判断是否为等边三角形。 首先,定义一个函数isTriangle(int a, int b, int c),用于判断三条边a、b、c能否组成一个三角形: ```c int isTriangle(int a, int b, int c) { if (a + b > c && a + c > b && b + c > a) { return 1; } else { return 0; } } ``` 再定义一个函数isEquilateral(int a, int b, int c),用于判断三角形是否为等边三角形: ```c int isEquilateral(int a, int b, int c) { if (a == b && b == c) { return 1; } else { return 0; } } ``` 在主函数中,读入三个整数表示三条线段的长度,调用isTriangle函数判断是否为三角形,如果不是则输出"No",否则调用isEquilateral函数判断是否为等边三角形,如果是则输出"E-Triangle",否则输出"G-Triangle"。 ```c #include <stdio.h> int isTriangle(int a, int b, int c) { if (a + b > c && a + c > b && b + c > a) { return 1; } else { return 0; } } int isEquilateral(int a, int b, int c) { if (a == b && b == c) { return 1; } else { return 0; } } int main() { int a, b, c; printf("请输入三条线段的长度:"); scanf("%d %d %d", &a, &b, &c); if (!isTriangle(a, b, c)) { printf("No\n"); } else if (isEquilateral(a, b, c)) { printf("E-Triangle\n"); } else { printf("G-Triangle\n"); } return 0; } ``` 以上就是判断三条线段是否能组成三角形以及是否为等边三角形的C语言程序。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值