题目背景:
爱丽丝想要学几何,可是她对数学是一脸懵逼。这不,某天几何老师在黑板上出了这样一道题:给定一个长度为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;
}