【问题标题】:Number which can be written as sum of two Squares可以写成两个平方和的数字
【发布时间】:2015-08-28 11:47:16
【问题描述】:

从数学原理:

一个数 N 可以表示为 2 个平方和当且仅当在 N 的素数分解中,(4k+3) 形式的每个素数都出现偶数次!

我所做的是预先计算所有4k+3 数字并通过连续除法检查它的频率。

这个程序是根据约束写的:

1 < T <100
0 < N < 10 ^ 12

import java.util.Scanner;

public class TwoSquaresOrNot {
    static int max = 250000;
    static long[] nums = new long[max];

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int i = 0; i < max; ++i)
            nums[i] = 4 * i + 3;
        while (T-- > 0) {
            long n = sc.nextLong();
            System.out.println((canWrite(n) ? "Yes" : "No"));
        }
    }

    private static boolean canWrite(long n) {
        // TODO Auto-generated method stub
        for (int i = 0; i < nums.length; ++i) {//loop through all the numbers
            if (nums[i] > n)
                return true;
            int count = 0;
            while (n % nums[i] == 0) {
                count++;
                n /= nums[i];
            }
            if (count % 2 != 0)//check for odd frequency
                return false;
        }
        return true;
    }
}

但这似乎不适用于SPOJ 网站。

我错过了什么吗?还是我做错了什么?

0 也考虑在内。

Some valid cases are:

1 = 1^2 + 0^2
8 = 2^2 + 2^2

【问题讨论】:

  • 我没有测试你的代码,但你可以尝试删除中间的System.out.print。它可能会影响网站。
  • 啊啊啊!谢谢。我没看到。即使答案是错误的。
  • “0”算正方形吗?如果不是,9 是一个微不足道的反例。
  • 是的,它确实算作平方数的总和。 0^2 + 3^2 = 9 有效。
  • 嗨,OP。如果我正确理解了定理陈述,那么我在下面突出显示的代码存在几个问题。让我知道这是否正确。

标签: java numbers number-theory


【解决方案1】:

根据 OP 的评论进行编辑。

几件事。第一:如果你正在寻找素因数分解,你可以在 > sqrt(n) 时停止,你不必一直走到 n。

所以你的代码应该变成这样:

private static boolean canWrite(long n) {
    // TODO Auto-generated method stub
    for (int i = 0; i < nums.length; ++i) {//loop through all the numbers
        //FIRST CHANGE: Sqrt
        if (nums[i] > Math.sqrt(n))
            break;
        int count = 0;
        while (n % nums[i] == 0) {
            //SECOND CHANGE: count as an array
            count[i]++;
            n /= nums[i];
        }
    }
    //SECOND CHANGE: count as an array
    for (int i=0; i<count.length; i++) {
      if (count[i] %2 != 0) return false;
    }
    return true;
}

【讨论】:

  • 我真的很欣赏平方根 n 方法。尽管这种方法并没有超时。我也会考虑的。检查isPrime() 的第二件事是浪费时间。如果它不是素数,则不会有倍数,因为先前的素数会删除这些(35 删除 15 倍数)。这只是有点开销。第三件事,你以错误的方式得到了陈述。它指出,即使可以写为4k+3 的数字之一具有奇数频率,也不能表示为sum of 2 squares。谢谢。
  • 主要检查 250000 个大数字并不是一个好主意。因为它的因子将被较早的素数消除。因此控件不会进入while循环。其余的可以自行解释
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
相关资源
最近更新 更多