| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6514 人关注过本帖
标题:很简单的一道题,计算勾股数(100以内)
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:100 回复次数:13 
很简单的一道题,计算勾股数(100以内)
要求去除重复的勾股数 比如 3 4 5 和4 3  5 这算一组

测试案例输出:

程序代码:

 3 ^2 +  4 ^2 =  5 ^2

 5 ^2 + 12 ^2 = 13 ^2

 6 ^2 +  8 ^2 = 10 ^2

 7 ^2 + 24 ^2 = 25 ^2

 8 ^2 + 15 ^2 = 17 ^2

 9 ^2 + 12 ^2 = 15 ^2

 9 ^2 + 40 ^2 = 41 ^2
10 ^2 + 24 ^2 = 26 ^2
11 ^2 + 60 ^2 = 61 ^2
12 ^2 + 16 ^2 = 20 ^2
12 ^2 + 35 ^2 = 37 ^2
13 ^2 + 84 ^2 = 85 ^2
14 ^2 + 48 ^2 = 50 ^2
15 ^2 + 36 ^2 = 39 ^2
16 ^2 + 30 ^2 = 34 ^2
16 ^2 + 63 ^2 = 65 ^2
18 ^2 + 24 ^2 = 30 ^2
18 ^2 + 80 ^2 = 82 ^2
20 ^2 + 21 ^2 = 29 ^2
20 ^2 + 48 ^2 = 52 ^2
21 ^2 + 28 ^2 = 35 ^2
21 ^2 + 72 ^2 = 75 ^2
24 ^2 + 32 ^2 = 40 ^2
24 ^2 + 45 ^2 = 51 ^2
24 ^2 + 70 ^2 = 74 ^2
27 ^2 + 36 ^2 = 45 ^2
28 ^2 + 45 ^2 = 53 ^2
30 ^2 + 72 ^2 = 78 ^2
32 ^2 + 60 ^2 = 68 ^2
33 ^2 + 44 ^2 = 55 ^2
35 ^2 + 84 ^2 = 91 ^2
36 ^2 + 48 ^2 = 60 ^2
39 ^2 + 80 ^2 = 89 ^2
40 ^2 + 42 ^2 = 58 ^2
42 ^2 + 56 ^2 = 70 ^2
48 ^2 + 55 ^2 = 73 ^2
48 ^2 + 64 ^2 = 80 ^2
54 ^2 + 72 ^2 = 90 ^2
57 ^2 + 76 ^2 = 95 ^2
60 ^2 + 63 ^2 = 87 ^2
65 ^2 + 72 ^2 = 97 ^2
2015-01-09 15:04
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
我的代码表示很复杂,循环次数太多,
我感觉主要是剔除重复的勾股数,比较麻烦一些,
程序代码:
#include<stdio.h>

int main()
{
    int a,b,c;
    int i;
    int t[10000]={0};
    for(a=3;a<100;a++)
    {
        for(b=a+1;b<100;b++)
        {
            for(c=b+1;c<a+b && c<100;c++)
            {
                if(a*a+b*b==c*c) t[c]++;
            }
        }
    }
    for(a=3;a<100;a++) 
    {
        for(b=a+1;b<100;b++)
        {
            for(i=0;i<10000;i++)
            {
                if(t[i]>0 && a*a+b*b==i*i)
                {
                    printf("%2d ^2 + %2d ^2 = %2d ^2\n",a,b,i);
                    t[i]=0;
                }
            }
        }
    }
    return 0;
}


[ 本帖最后由 wp231957 于 2015-1-9 15:42 编辑 ]

DO IT YOURSELF !
2015-01-09 15:06
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:15 
for( a = 1; ……
    for( b = a+1; ……
        for( c = b+1; ……
行么?
2015-01-09 15:19
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用rjsp在2015-1-9 15:19:07的发言:

for( a = 1; ……
    for( b = a+1; ……
        for( c = b+1; ……
行么?


结果没啥区别,不过循环次数估计少了不少,具体少了多少 我还不会算,估计也不是指数级别的

DO IT YOURSELF !
2015-01-09 15:23
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:15 
回复 2楼 wp231957
 for(a = 3; a < 100; a++) {
        for(b = a + 1; b < 100; b++) {
            for(c = b + 1; c < a + b && c < 100; c++) {

Only the Code Tells the Truth             K.I.S.S
2015-01-09 15:37
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
3楼和5楼所做的修改都是减少重复循环次数

我主要想看看剔除重复 例如 3 4 5, 4 3 5, 5 12 13 ,12  5 13 大家是如何做的,我以前有一个不成形的想法,但是最终没有实现,反而这个想法得到了实现

DO IT YOURSELF !
2015-01-09 15:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
回复 6楼 wp231957
按照我们的写法,就不存在重复数呀
2015-01-09 15:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
随手瞎写的,你检查一下,可能有错误

程序代码:
#include <stdio.h>

int main()
{
    for( unsigned a=1; a<100; ++a )
    {
        for( unsigned b=a+1; b<100 && a*a+b*b<100*100; ++b )
        {
            unsigned c;
            for( c=b+1; c*c<a*a+b*b; ++c );

            if( a*a+b*b == c*c )
                printf( "%2d^2 + %2d^2 = %2d^2\n", a, b, c );
        }
    }

    return 0;
}

2015-01-09 16:00
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:15 
int i,j,k;
for(i=3;i<100;i++)
  for(j=i-1;j>0;j--)
    for(k=j-1;k>0;k--)
      
这样不会有重复的,也可穷尽吧

能编个毛线衣吗?
2015-01-09 16:11
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:15 
程序代码:
#include <stdio.h>
#include <math.h>

int main()
{
    int a, b, c;
    double root;
    for (a = 3; a < 100; a++)
    {
        for (b = a+1; b < 100; b++)
        {
            root = sqrt((double)(a*a + b*b));
            c = (int)root;
            if (c >= 100)
                break;
            if (fabs(root - c) <= 1e-15)
                printf("%2d ^2 + %2d ^2 = %2d ^2\n",a,b,c);
        }
    }
}

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2015-01-09 17:53
快速回复:很简单的一道题,计算勾股数(100以内)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015802 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved