〇〇 发表于 2011-4-19 21:58:18

上面2楼的答案貌似都不太对


D:\lt\dl>ggs1 10
1: 3    4       5
2: 8    6       10
total:10    36

D:\lt\dl>ggs1 15
1: 3    4       5
2: 8    6       10
3: 5    12      13
total:15    66
漏了9 1215

〇〇 发表于 2011-4-19 22:22:03

但你们的答案都是一致的,10楼的效率好很多,改了下数据类型,防止溢出
#include <stdio.h>
typedef unsigned int DW;
DW Test(DW n)
{
    DW t,sum=0,c=0;
    DW a,b;
    for(b=1;b*b<n/2.0;b++)
      for(a=b+1;a*a<=n;a++)
      {c++;t=a*a+b*b;
            if(t<=n)
               /*printf("%d: %d\t%d\t%d\t\n",c,a*a-b*b,2*a*b,t),*/ sum+=2*a*(a+b);else break;
      }            
    return sum;
}

DW main(int c ,char **v)
{   if (c==2) {
                printf("total:%s    %u\n",v,Test(atoi(v)));
    }
    return 0;

}
D:\lt\dl>ggs1 100
total:100    3864

D:\lt\dl>timer ggs1 1000000
Timer 9.01 : Igor Pavlov : Public domain : 2009-05-31
total:1000000    3387036080

Kernel Time=   0.031 =   48%
User Time    =   0.015 =   24%
Process Time =   0.046 =   72%
Global Time=   0.064 =100%

G-Spider 发表于 2011-4-19 22:53:00

12# 〇〇
看来#6的转化与题目要求不等价。
勾股数 形如:{a^2+b^2 ,a^2-b^2 ,2ab}
            5         3       4
                                  2*2*1 (得到3)
            15      9       12
                              2*6*1
                              2*3*2   (得不到9)
所以问题的实质就是,求所有满足a^2+b^2 <= n 的非平凡的正整数解。

还考虑看公因子,不知这样能不能完全包含。
3*(5    3    4) =(15   9   12)

wayne 发表于 2011-4-20 10:14:16

12# 〇〇
打印非平凡的解。
统计的是所有的解:#include <stdio.h>
typedef unsigned int DW;
inline DW gcd(DW m,DW n){DW t;while(m!=0) t=m,m=n%m,n=t;return n;}
DW Test(DW n)
{
    DW t,s,ii,cnt=0,sum=0,c=0;
    DW a,b;
    for(b=1;b*b<n/2.0;b++)
      for(a=b+1;a*a<n;a++)
      {t=a*a+b*b;
            if(t<=n){
               if(gcd(a-b,2*b)==1){
                      s=1;
                      for(ii=1;ii<=s;ii++) printf("%5u:%10u\t%10u\t%10u\n",++cnt,ii*(a*a-b*b),2*ii*a*b,ii*t);
                      s=n/t;
                      sum+=s*(s+1)*a*(a+b);
               }
            } else break;
      }
    return sum;
}

int main(int c ,char **v)
{
        if (c==2) {
      printf("total of triples less than %s :\t%u\n",v,Test(atoi(v)));
    }
    return 0;
}

wayne 发表于 2011-4-20 10:25:13

12# 〇〇
发现答案还是不一样,能否把你的ggs1 100的全部的解打印出来
我的是:
    1:         3                 4                 5
    1:         6                 8                10
    1:         9                12                15
    1:      12                16                20
    1:      15                20                25
    1:      18                24                30
    1:      21                28                35
    1:      24                32                40
    1:      27                36                45
    1:      30                40                50
    1:      33                44                55
    1:      36                48                60
    1:      39                52                65
    1:      42                56                70
    1:      45                60                75
    1:      48                64                80
    1:      51                68                85
    1:      54                72                90
    1:      57                76                95
    1:      60                80             100
    2:      15                 8                17
    2:      30                16                34
    2:      45                24                51
    2:      60                32                68
    2:      75                40                85
    3:      35                12                37
    3:      70                24                74
    4:      63                16                65
    5:         5                12                13
    5:      10                24                26
    5:      15                36                39
    5:      20                48                52
    5:      25                60                65
    5:      30                72                78
    5:      35                84                91
    6:      21                20                29
    6:      42                40                58
    6:      63                60                87
    7:      45                28                53
    8:      77                36                85
    9:         7                24                25
    9:      14                48                50
    9:      21                72                75
    9:      28                96             100
   10:      55                48                73
   11:         9                40                41
   11:      18                80                82
   12:      33                56                65
   13:      65                72                97
   14:      11                60                61
   15:      39                80                89
   16:      13                84                85
total of triples less than 100 :        7016

〇〇 发表于 2011-4-20 22:39:31

这次对了。
with a as(select level a from dual connect by level<=:m)
,t as(select /*+use_hash(a ,b)*/:m,a.a,b.a b,sqrt(a.a*a.a+b.a*b.a)c from a,a b
whereb.a>a.a andceil(sqrt((a.a*a.a+b.a*b.a)))<=:m and instr(sqrt((a.a*a.a+b.a*b.a)),'.')=0
)
select * from t
union all
select :m,sum(a)+sum(b)+sum(c),null,null from t;

   :M          A          B          C
----- ---------- ---------- ----------
100          3          4          5
100          5         12         13
100          6          8         10
100          7         24         25
100          8         15         17
100          9         12         15
100          9         40         41
100         10         24         26
100         11         60         61
100         12         16         20
100         12         35         37
100         13         84         85
100         14         48         50
100         15         20         25
100         15         36         39
100         16         30         34
100         16         63         65
100         18         24         30
100         18         80         82
100         20         21         29
100         20         48         52
100         21         28         35
100         21         72         75
100         24         32         40
100         24         45         51
100         24         70         74
100         25         60         65
100         27         36         45
100         28         45         53
100         28         96      100
100         30         40         50
100         30         72         78
100         32         60         68
100         33         44         55
100         33         56         65
100         35         84         91
100         36         48         60
100         36         77         85
100         39         52         65
100         39         80         89
100         40         42         58
100         40         75         85
100         42         56         70
100         45         60         75
100         48         55         73
100         48         64         80
100         51         68         85
100         54         72         90
100         57         76         95
100         60         63         87
100         60         80      100
100         65         72         97
100       7016

53行。

wayne 发表于 2011-4-21 09:22:00

16# 〇〇
Timer 9.01 : Igor Pavlov : Public domain : 2009-05-31
:victory:
这个timer工具那可以下载呢

〇〇 发表于 2011-4-21 09:53:48

wayne 发表于 2011-4-21 10:07:14

18# 〇〇
thanks,有源代码吗,不是说属于Public domain 了吗

G-Spider 发表于 2011-4-21 10:42:39

17# wayne
903版,包括源码。
7bench903.zip
页: 1 [2] 3 4 5
查看完整版本: 如何求出1-n以内勾股数之和