木棒三角形问题
Description:
小A家里有很多长度不一样的木棍,有一天他很无聊,只能摆弄这些木棒来解闷了。小A的数学学得很好,所以他想在这些木棒中挑出3根来组成一个直角三角形,当然,他有可能有很多种选法,所以他还想挑出一个面积最大的。
Input:
输入有多组,每组输入包括2行,第一行输入一个n(0<=n<=100),表示小A有n根木棍,接着一行有n个整数(<=1000),表示木棍的长度(长度从小到大给出)。
Output:
输出面积最大的直角三角形的面积,且保留3位小数,如果不能组成,输出“My Good!”
Sample Input:
4
1 2 3 4
5
2 3 4 5 6
6
3 4 5 6 8 10
2
1 1
Sample Output:
My Good!
6.000
24.000
My Good!
View Code
1 #include <stdio.h> 2 3 /* 4 * 判断数据是否构成直角三角形 5 * p<q<r 6 */ 7 int istriangle(int p, int q, int r) 8 { 9 return (p+q > r) && (p*p+q*q == r*r) ? 1 : 0; 10 } 11 12 /* 13 * 求解前n个数据中构成直角三角形的最大面积 14 */ 15 void max(int i, int *data, int *m, int *n, int *t, int *smax) 16 { 17 int j, k, s; 18 19 if (i <= 2) { 20 if (istriangle(data[0], data[1], data[2])) { 21 *m = 0; 22 *n = 1; 23 *t = 2; 24 *smax = data[0] * data[1]; 25 } 26 return ; 27 } 28 29 max(i-1, data, m, n, t, smax); //递归调用 30 31 for (j = 0; j < *m; j++) { 32 for (k = *n; k < i; k++) { 33 if (istriangle(data[j], data[k], data[i])) { 34 *m = j; 35 *n = k; 36 *t = i; 37 s = data[j] * data[k]; 38 *smax = *smax > s ? *smax : s; 39 } 40 } 41 } 42 43 for (j = *m; j < i; j++) { 44 for (k = j+1; k < i; k++) { 45 if (istriangle(data[j], data[k], data[i])) { 46 *m = j; 47 *n = k; 48 *t = i; 49 s = data[j] * data[k]; 50 *smax = *smax > s ? *smax : s; 51 } 52 } 53 } 54 55 for (j = *n; j < i; j++) { 56 for (k = j+1; k < i; k++) { 57 if (istriangle(data[j], data[k], data[i])) { 58 *m = j; 59 *n = k; 60 *t = i; 61 s = data[j] * data[k]; 62 *smax = *smax > s ? *smax : s; 63 } 64 } 65 } 66 return ; 67 } 68 69 /* 70 * 一组木棒长度数组,计算其构成直角三角形的最大面积。 71 * 若无法构成直角三角形,返回0 72 */ 73 74 int triangle(int len, int *data) 75 { 76 int m = -1, n = -1, t = -1, smax = 0; 77 78 if (len < 3 || data == NULL) {//木棒数据不足3个或数据为NULL,一定无法构成直角三角形。 79 return 0; 80 } 81 82 max(len, data, &m, &n, &t, &smax); 83 84 return smax; 85 } 86 87 int main(int argc, char **argv) 88 { 89 int max = 0; 90 int data[] = {1, 1}; 91 92 93 max = triangle(2, data); 94 95 if (max <= 0) { 96 printf("My Good!\n"); 97 return 0; 98 } 99 printf("ss%d\n", max); 100 101 return 0; 102 }

浙公网安备 33010602011771号