ACM复习(7)1079 三角形

来源:互联网 发布:我给男闺蜜飞机知乎 编辑:程序博客网 时间:2024/06/05 16:27

Description
著名的数学家毕达哥拉斯可能从来都不曾想过有人居然会问他这样的一个问题:给出一个整数,存在多少个直角三角形,
它的某一条边的长度等于这个整数,而且其他边的长度也是整数。既然毕达哥拉斯不可能预见到有计算机的出现,
如果他回答不出来,那谁又能责怪他呢?但是现在既然你有了计算机,那么回答不出来就说不过去了。

输入格式 第一行有一个整数n,代表有多少个数据(1<=n<=20)。接下来有n行,每行代表一个数据。一个数据就是一个整数ai(a<=i<=n,1<=ai<=100)。

输出格式
每个数据都必须有相应的输出。两个数据的输出之间有一个空行。最后一个测试数据的输出后不要加空行。
对于每一个数据,如果找不到解,则输出一个空行。如果找到解,就把符合条件的所有直角三角形输出。每个三角形占一行,输出该三角形的另外两条边,必须先输出长边,然后一个逗号,再输出短边。两个三角形之间不能有空行,而且必须按照长边降序排列。

输入样例
2
20
12

输出样例
101,99
52,48
29,21
25,15
16,12

37,35
20,16
15,9
13,5


解题思路

将输入作为最长边,中长半,最短边分别遍历就行
需要注意的是作为最短边时的限制条件:

y2b2=a2
(yb)(y+b)=a2
(y+b)=a2/(yb)

因为 y, b都为整数,所以(yb)1
所以(y+b)a2

#include<stdio.h>#include<math.h>int main(){    int n, a, result[1001][2] = {0}, q;    double y;    scanf("%d", &n);    while(n --)    {        q = 0;        scanf("%d", &a);        if(a < 3)        {            if(n == 0)                break;            else            {                printf("\n\n");                continue;            }        }        int k = a * a;        // 向上取整,避免作为最长边遍历时出现类似5 4 3 和 5 3 4 这样的情况        int t = ceil(sqrt(k / 2.0));        // 作为最短边        for(int i = a; ;i ++)        {            y = sqrt(k + i * i);            if(y + i > k)                break;            if(y - (int)y < 0.00001)            {                result[q][0] = (int)y;                result[q][1] = i;                q ++;            }        }        for(int i = q - 1; i >= 0; i --)            printf("%d,%d\n", result[i][0], result[i][1]);        q = 0;        // 作为中长边        for(int i = a; i >= 1; i --)        {            y = sqrt(k + i * i);            if(y - (int)y < 0.00001)            {                result[q][0] = (int)y;                result[q][1] = i;                q ++;            }        }        // 作为最长边        for(int i = a - 1; i >= t; i --)        {            y = sqrt(k - i * i);            if(y - (int)y < 0.00001)            {                result[q][0] = i;                result[q][1] = (int)y;                q ++;            }        }        for(int i = 0; i < q; i ++)        {            if(n == 0 && i == q - 1)                printf("%d,%d", result[i][0], result[i][1]);            else                 printf("%d,%d\n", result[i][0], result[i][1]);         }        if(n != 0)            printf("\n");    }    return 0;}       

原创粉丝点击