public class Find_A_K { public static void findK(int n) { List result = new ArrayList(); for (int k = 1; k <= n; k++) { for (int i = 1; i <= Math.sqrt(k); i++) for (int j = 1; j <= Math.sqrt(k); j++) { if ((i * i + j * j) == k) { if(!result.contains(k)) result.add(k);
(defn find-k [n] (let [s (int (Math/sqrt n))] (distinct (for [a (range 1 (inc s)) b (range a (inc s)) :let [c (+ (* a a) (* b b))] :when (<= c n)] c))))
【在 z*********8 的大作中提到】 : public class Find_A_K : { : public static void findK(int n) { : List result = new ArrayList(); : for (int k = 1; k <= n; k++) : { : for (int i = 1; i <= Math.sqrt(k); i++) : for (int j = 1; j <= Math.sqrt(k); j++) { : if ((i * i + j * j) == k) : {
【在 p*****2 的大作中提到】 : : (defn find-k [n] : (let [s (int (Math/sqrt n))] : (distinct : (for [a (range 1 (inc s)) : b (range a (inc s)) : :let [c (+ (* a a) (* b b))] : :when (<= c n)] : c))))
l*a
22 楼
if ((i * i + j * j) == k) <=n就可以了 少一重循环
【在 z*********8 的大作中提到】 : public class Find_A_K : { : public static void findK(int n) { : List result = new ArrayList(); : for (int k = 1; k <= n; k++) : { : for (int i = 1; i <= Math.sqrt(k); i++) : for (int j = 1; j <= Math.sqrt(k); j++) { : if ((i * i + j * j) == k) : {
l*a
23 楼
注意他的循环初始条件
【在 e*******o 的大作中提到】 : 没去重吧。
z*8
24 楼
update: public class Find_A_K { public static void findK(int n) { List result = new ArrayList(); for (int i = 1; i <= Math.sqrt(n); i++)
{ for (int j = 1; j <= Math.sqrt(n); j++) { int mul = i*i + j*j; if (mul <= n) { if(!result.contains(mul)) result.add(mul);
something I am missing. k = a^2 + b^2, what else do you need to do? there will be only one K. if k is given, find a and b, which may make more sense.
e*o
26 楼
假设 b >= a , 参考二爷的程序。 最后去重,你一个一个的检验多费功夫。 去重不可少的 5,5,50 1,7,50
【在 z*********8 的大作中提到】 : update: : public class Find_A_K : { : public static void findK(int n) : { : List result = new ArrayList(); : for (int i = 1; i <= Math.sqrt(n); i++) : : { for (int j = 1; j <= Math.sqrt(n); j++) : {
a*s
27 楼
你们以上的搜索都是brute force没有注意到数字的特殊性。 当 a + b = c 时而且a,b,c都是正整数, a^2 + b^2 <= c^2 是永远成立的。 所以搜索的范围可以减小。只需要从两个数的和大于等于sqrt(k),并且两个数都比sqrt (k)小,里面找就行了。在利用对称性又可以进一步减少搜索的范围。 edit: 另外如果k是偶数,两个数必须同时是奇数或偶数 如果k是奇数,两个数必须一个是奇数一个偶数
p*2
28 楼
确实有问题。fix了。
【在 e*******o 的大作中提到】 : 假设 b >= a , 参考二爷的程序。 : 最后去重,你一个一个的检验多费功夫。 : 去重不可少的 : 5,5,50 : 1,7,50
public static void findSquareSum(int n) { for(int a = 1, lenA = (int) Math.ceil(Math.sqrt(n)); a < lenA ; a++) for (int b = 1, lenB = (int) Math.sqrt(n - a * a); b <= lenB && b <= a; b ++) System.out.println("a : " + a + ", b : " + b + " -> " + (a*a + b*b)); }