1079 三角形[C]

来源:互联网 发布:程序员博客网站 编辑:程序博客网 时间:2024/05/12 23:26

1079 三角形

时间限制:500MS  内存限制:65536K
提交次数:283 通过次数:82

题型: 编程题   语言: C++;C

Description

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



输入格式

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


输出格式

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


输入样例

22012


输出样例

101,9952,4829,2125,1516,1237,3520,1615,913,5


作者

admin


思路:首先膜拜下毕达哥拉斯之神,然后这道题就是根据勾股定理思路来解题(a^2+b^2=c^2)。

这里要分两种情况讨论。

当输入n为非长边的任意边时,可根据公式

当n为长边时,就由1累积,判断是否是整数。


代码


#include <stdio.h>#include <math.h>int side[100][2];int t;void side_others(int n){    int i,n1,n2;    double m1,m2;    n=n*n;    for(i=1; i*i<n; i++)    {        if(n%i==0)//是否可进行因式分解        {            //a^2+b^2=c^2            //a^2=c^2-b^2=(c+b)(c-b)            //设x1=(c+b),x2=(c-b)            //c=(x1+x2)/2,b=(x1-x2)/2            n1=i;            n2=n/i;            m1=(n1+n2)/2.0;            if(m1==(int)m1)            {                m2=fabs((n1-n2)/2.0);                if(m2==(int)m2)                {                    side[t][0]=m1;                    side[t][1]=m2;                    t++;                }            }        }    }}void side_long(int n){    int i;    double m;    for(i=1; i*i<=(n*n)/2; i++)//i*i大于n*n/2会造成重复    {        m=sqrt(n*n-i*i);        if(m==(int)m)//判断是否整数        {            side[t][0]=m;            side[t][1]=i;            t++;        }    }}int main(){    int i,n,loop;    scanf("%d",&loop);    while(loop--)    {        scanf("%d",&n);        t=0;        side_others(n);        side_long(n);        for(i=0; i<t; i++)        {            printf("%d,%d\n",side[i][0],side[i][1]);        }        if(loop!=0)        {            printf("\n");        }    }}



0 0
原创粉丝点击