〇〇
发表于 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