首先,我无法理解exec
中select
和kdb
之间的区别。 reference for exec并没有多大帮助!
其次,我试图编写一个程序来解决Euler problem 5。我使用mod
和each
解决了这个问题,但速度慢,需要大量空间。我相信我可以通过将20的素数分解的值相加来实现。那是对的吗?如果是这样,有人可以协助我这样做吗?我已经写了以下内容来获得素数因子分解。它还无法列入清单。
f1:{(x mod y) = 0}
f2:{if[f1[a;y]&(not max f1[y;x],0);x:x,y];x}
f3:{x+:1;y:f2[y;x];if[x<a;y:.z.s[x;y]];y}
f3[1;()
答案 0 :(得分:4)
关于第一个问题,exec
基本上是select
的更一般形式。 select
查询将以表格格式返回您查询的内容,而exec
更灵活,可以从表中返回您想要的任何类型的数据。
例如,如果我们有一个表
t:([]a:10?`aa`bb`cc;b:10?10)
然后我们可以使用exec从表中获取列数据列表
q)exec a from t
`cc`aa`aa`aa`bb`aa`bb`cc`cc`cc
有时非常方便。还
q)exec a,b from t
a| cc aa aa aa bb aa bb cc cc cc
b| 6 4 1 3 3 7 8 2 1 4
q)exec a!b from t
cc| 6
aa| 4
aa| 1
aa| 3
bb| 3
aa| 7
bb| 8
cc| 2
cc| 1
cc| 4
提取字典。第一个将列名称作为键,将列作为值,第二个将列a作为键,将列b作为值。在创建数据透视表http://code.kx.com/q/cookbook/pivoting-tables/时可以看到这些正在使用的一个很好的小例子。
最后,您可以使用
获取完整的表格exec by 0b from t
相当于
select from t
by 0b
隐含在select语句中。事实上,你可以通过查看两者的解析树来看到这一点。
q)parse"exec from t"
?
`t
()
()
()
q)parse"select from t"
?
`t
()
0b
()
答案 1 :(得分:1)
这个问题的简单解决方案是: -
LCM(1,2,3,......20)=1*5*7*8*9*11*13*17*19=116396280;
因此,为LCM程序开发代码,该程序将给出n个数字的LCM ......
答案 2 :(得分:1)
关于你的第二个问题,你也可以使用欧几里得的算法来快速解决问题。
欧几里德的算法。用于查找2个数字的GCD,速度非常快。它使用以下属性:
GCD(a; b)= GCD(b; a mod b)。这一直持续到(a mod b)返回0并且一旦发生这种情况,'b'就是gcd。
参考(GCD部分):http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=math_for_topcoders
可以使用GCD找到LCM。
LCM of a&b = (a*b) / GCD of a & b
此外,还需要另外一个公式:
LCM of a & b & c = LCM of (LCM of a & b) & c
使用上面的算法和逻辑,这是我尝试过的:
q) gcd:{[a;b] first {(x[1];x[0] mod x[1])}/[{0<>x[1]};(a;b)]}
q )lcm:{[l]{floor (x*y) % gcd[x;y]}/[l]}
q) lcm[1_til 10]
输出:2520
q) lcm[1_til 20]
输出:232792560
q) \ts lcm[1_til 20]
输出:0 864
计算时间不到1毫秒(约15毫秒)。