【Codewars】Integers: Recreation One

19 篇文章 0 订阅
17 篇文章 0 订阅

Codewars里的 5kyu Kata。

题目说明:

Divisors of 42 are : 1, 2, 3, 6, 7, 14, 21, 42. These divisors squared are: 1, 4, 9, 36, 49, 196, 441, 1764. The sum of the squared divisors is 2500 which is 50 * 50, a square!

Given two integers m, n (1 <= m <= n) we want to find all integers between m and n whose sum of squared divisors is itself a square. 42 is such a number.

The result will be an array of arrays or of tuples (in C an array of Pair) or a string, each subarray having two elements, first the number whose squared divisors is a square and then the sum of the squared divisors.

#Examples:

list_squared(1, 250) --> [[1, 1], [42, 2500], [246, 84100]]
list_squared(42, 250) --> [[42, 2500], [246, 84100]]

The form of the examples may change according to the language, see Example Tests: for more details.

Note

In Fortran - as in any other language - the returned string is not permitted to contain any redundant trailing whitespace: you can use dynamically allocated character strings.

解题代码:

import java.util.ArrayList;

public class SumSquaredDivisors {
  
    public static String listSquared(long m, long n) {
         // your code
        ArrayList<Long> divisors = new ArrayList<Long>();
        ArrayList<ArrayList<Long>> res = new ArrayList<ArrayList<Long>>();

        for (long c = m; c < n; c++) {
            divisors.clear();
            //divisors.add((long) 1);
            for (long i = 1; i <= c / 2; i++) {
                if (c % i == 0) {
                    divisors.add(i);
                }
            }
            divisors.add(c);

            long sum = new Long(0);
            for (int i = 0; i < divisors.size(); i++) {
                sum += (long) Math.pow(divisors.get(i).longValue(), 2);
            }

            Long s = new Long(sum);
            Double d = new Double(Math.sqrt(sum));

            if (d.toString().substring(d.toString().indexOf('.')).equals(".0")) {
                ArrayList r = new ArrayList<Long>();
                r.add(c);
                r.add(sum);
                res.add(r);
            }

        }

        return res.toString();
    }
}

Test Cases:

import static org.junit.Assert.*;

import java.util.Random;

import org.junit.Test;

public class SumSquaredDivisorsTest {

    private static long[] solAux(long n) {
        long s = 0;
        long nf = 0;
        long[] res = new long[2];
        for (long i = 1; i <= Math.floor(Math.sqrt(n)); i += 1) {
            if (n % i == 0) {
                s += i * i;
                nf = n / i;
                if (nf != i)
                    s += nf * nf;
            }
        }
        if (Math.pow((long) Math.sqrt(s), 2) == s) {
            res[0] = n;
            res[1] = s;
            return res;
        } else
            return null;
    }

    public static String solution(long m, long n) {
        String res = "[";
        for (long i = m; i <= n; i++) {
            long[] r = solAux(i);
            if (r != null) {
                res += "[" + Long.toString(r[0]) + ", " + Long.toString(r[1]) + "], ";
            }
        }
        return res.replaceFirst(",\\s$", "") + "]";
    }

    @Test
    public void test1() {
        assertEquals("[[1, 1], [42, 2500], [246, 84100]]", SumSquaredDivisors.listSquared(1, 250));
    }

    @Test
    public void test2() {
        assertEquals("[[42, 2500], [246, 84100]]", SumSquaredDivisors.listSquared(42, 250));
    }

    @Test
    public void test3() {
        assertEquals("[[287, 84100]]", SumSquaredDivisors.listSquared(250, 500));
    }

    @Test
    public void test4() {
        assertEquals("[]", SumSquaredDivisors.listSquared(300, 600));
    }

    @Test
    public void test5() {
        assertEquals("[[728, 722500], [1434, 2856100]]", SumSquaredDivisors.listSquared(600, 1500));
    }

    @Test
    public void test6() {
        assertEquals("[[1673, 2856100]]", SumSquaredDivisors.listSquared(1500, 1800));
    }

    @Test
    public void test7() {
        assertEquals("[[1880, 4884100]]", SumSquaredDivisors.listSquared(1800, 2000));
    }

    @Test
    public void test8() {
        assertEquals("[]", SumSquaredDivisors.listSquared(2000, 2200));
    }

    @Test
    public void test9() {
        assertEquals("[[4264, 24304900]]", SumSquaredDivisors.listSquared(2200, 5000));
    }

    @Test
    public void test10() {
        assertEquals("[[6237, 45024100], [9799, 96079204], [9855, 113635600]]",
                SumSquaredDivisors.listSquared(5000, 10000));
    }

    @Test
    public void testA() {
        System.out.println("****** Random test ******");
        Random rnd = new Random();
        for (int i = 0; i < 20; i++) {
            int m = Math.round(rnd.nextInt(25) * (42 - 2) + 200);
            int n = Math.round(rnd.nextInt(125) * (42 - 2) + 1100);
            System.out.println("listSquared m: " + m + " n: " + n);
            assertEquals(SumSquaredDivisorsTest.solution(m, n), SumSquaredDivisors.listSquared(m, n));
        }
    }

}

个人总结:

import java.util.stream.LongStream;

public class SumSquaredDivisors {

    public static String listSquared(long m, long n) {
        // your code
        String result = "[";
        for (long i = m; i <= n; i++) {
            if (Math.round(Math.sqrt(sumOfSquareDivisors(i))) == Math.sqrt(sumOfSquareDivisors(i))) {
                result += "[" + i + ", " + sumOfSquareDivisors(i) + "], ";
            }
        }
        return result.length() > 1 ? result.substring(0, result.length() - 2) + "]" : "[]";
    }

    public static long sumOfSquareDivisors(long n) {
        return LongStream.range(1, n + 1).filter(i -> n % i == 0).map(i -> i * i).sum();
    }
}
import java.util.ArrayList;
import java.util.List;

public class SumSquaredDivisors {

    public static String listSquared(long m, long n) {
        List<List<Integer>> finalRes = new ArrayList<List<Integer>>();
        for (long i = m; i <= n; i++) {
            double result = 0;
            for (int y = 1; y <= i; y++) {
                if (i % y == 0) {
                    result = result + Math.pow(y, 2);
                }
            }
            if (Math.sqrt(result) % 1 == 0) {
                List<Integer> pair = new ArrayList<Integer>();
                pair.add((int) i);
                pair.add((int) result);
                finalRes.add(pair);
            }
        }
        return finalRes.toString();
    }
}
import java.util.ArrayList;
import java.util.stream.LongStream;

public class SumSquaredDivisors {

    public static String listSquared(long m, long n) {
        ArrayList<String> strings = new ArrayList<>();
        LongStream.rangeClosed(m, n).forEach(current -> {
            long sum = LongStream.rangeClosed(1, current).filter(i -> current % i == 0).map(i -> i * i).sum();
            if (Math.sqrt(sum) % 1 == 0)
                strings.add(String.format("[%d, %d]", current, sum));
        });
        return String.valueOf(strings);
    }
}
import java.util.Arrays;
import java.util.stream.LongStream;

public class SumSquaredDivisors {

    public static String listSquared(long m, long n) {
        // your code
        String[] tempResult = LongStream.rangeClosed(m, n).boxed().map(l -> new long[] { l, sumSquaredDivisors(l) })
                .filter(ls -> isSquared(ls[1])).map(Arrays::toString).toArray(String[]::new);
        return Arrays.toString(tempResult);
    }

    private static boolean isSquared(long n) {
        long sqrtN = (long) Math.sqrt(n);
        return sqrtN * sqrtN == n;
    }

    private static long sumSquaredDivisors(long n) {
        return LongStream.rangeClosed(1, (long) Math.sqrt(n)).filter(l -> n % l == 0)
                .map(l -> (l * l) + ((n / l) == l ? 0 : (n / l) * (n / l))).sum();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值