爱丽丝拼三角形

题目背景:

爱丽丝想要学几何,可是她对数学是一脸懵逼。这不,某天几何老师在黑板上出了这样一道题:给定一个长度为n的木棍,将其切割成长度为正整数a,b,c(a<=b<=c)的三段,问有多少种切割方案,使得切下来的三段可以拼成一个三角形,等腰三角形以及直角三角形,同时,三角形的三条边均要严格处于[l,r]这个区间。几何老师叫了正在做梦的爱丽丝上来回答这道题,这时她想要请你编写一个程序解决这个问题,让她免受老师的批评。

输入格式:

第一行一个整数T,代表数据组数。

此后T行每行三个正整数n,l,r,表示木棍的长度为n,三角形三条边均位于[l,r]这个区间。

输出格式:

T行,每行三个整数t1,t2,t3,分别表示满足条件的三角形的个数,等腰三角形的个数,直角三角形的个数。输出以换行符结尾。

样例输入1:

1

10 3 7

样例输出1:

1 1 0

数据范围:

1<=T<=10, 1<=n<=300, 1<=l,r<=100, r<=n

# include<stdio.h>

/*给定一个长度为n的木棍,将其切割成长度为正整数a,b,c(a<=b<=c)的三段,问有多少种切割方案,
使得切下来的三段可以拼成一个三角形,等腰三角形以及直角三角形,
同时,三角形的三条边均要严格处于[l,r]这个区间。
输入格式:第一行一个整数T,代表数据组数。
此后T行每行三个正整数n,l,r,表示木棍的长度为n,三角形三条边均位于[l,r]这个区间。
输出格式:T行,每行三个整数t1,t2,t3,分别表示满足条件的三角形的个数,
等腰三角形的个数,直角三角形的个数。输出以换行符结尾。
样例输入1:
1
10 3 7
样例输出1:
1 1 0
数据范围:
1<=T<=10, 1<=n<=300, 1<=l,r<=100, r<=n*/

int main()
{
	int t, n, l, r, i = 0, j = 0, k = 0, a, b, c;
	scanf("%d", &t);
	int num[t][3];//在C90标准下,可变数组无法初始化,已知大小则可以初始化 ,
					//且可以定义之后延迟初始化 
	// 初始化时,如为char字符串的,则初始化时,未定位的部分自动赋\0 
	//其他类型的数组初始化时未定位的部分自动赋0
	 
	for(i = 0;i < t;i ++)//于是只能通过遍历给可变数组初始化 
	{
		for(j = 0;j < 3;j ++)
		{
			num[i][j] = 0;
		}
	}
	for (i = 0; i < t; i ++)
	{
		scanf("%d %d %d", &n, &l, &r); 
		a = l;//想法是这样的,先使a为l,b从a向上遍历 ,遍历至c时 
		b = l;//则令a++,再使b从a开始遍历,这样循环知道a大于c 
		c = n - 2*l;
		if(c < b)
		{
			continue;//如果在b、a=l时还c<b,则不可能为三角形,直接跳过这行数据 
		}
		while (n - 2*a >= a)
		{
			b = a;
			c = n - b - a;
			for(;c >= b;b ++,c = n - b - a)//每次循环使b++,同时刷新c 
			{//用for函数可以在括号里写操作,而while则要在代码块内写 (注意是在代码块开头还是结尾 
				if(c > r)//若c大于区间,可以通过增加b来使c减小 (别忘记这点 
				{
					continue;
				}
				if(b + a > c)//注意要先判断是否可成三角形, 
				{
					num[i][0] ++;//若是三角形,再判断直角和等腰 
					if(a == b || a == c || b == c)
					{
						num[i][1] ++;
					}
					if(c * c == a * a + b * b)//注意^在C语言中是按位取反 
					{
						num[i][2] ++;
					}//二位数组的三个列存三角形,等腰三角形,直角三角形 
				}
				else
				{
					continue;//不是三角形就下一循环	b++ 
				}			
			}
			a ++;
		}
	}
	
	for(i = 0;i < t;i ++)
	{
		printf("%d %d %d\n", num[i][0], num[i][1], num[i][2]);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值