Java 理解cstutoringcenter问题43解决方案错误中的问题

Java 理解cstutoringcenter问题43解决方案错误中的问题,java,algorithm,math,Java,Algorithm,Math,问题:前100000000个六边形数字中有多少个可以被1到20之间的所有数字整除 第二种解决方案-简单暴力(有效) 虽然很可能还有其他问题: ((tmp += qes) % 1 == 0) tmp和QE都是双倍的,这意味着==比较可能失败;请参见您可能应该链接到一个描述问题的链接,以便人们知道什么是六边形数 同样,在蛮力法中,您不需要重新检查数字中的公共素数因子,因为所有这些因子都必须是可除的,因此它可以缩短为: public static void main(String[] args) {

问题:前100000000个六边形数字中有多少个可以被1到20之间的所有数字整除

第二种解决方案-简单暴力(有效)


虽然很可能还有其他问题:

((tmp += qes) % 1 == 0)

tmp和QE都是双倍的,这意味着==比较可能失败;请参见

您可能应该链接到一个描述问题的链接,以便人们知道什么是六边形数

同样,在蛮力法中,您不需要重新检查数字中的公共素数因子,因为所有这些因子都必须是可除的,因此它可以缩短为:

public static void main(String[] args) {
  long hnr = 100000000L, count = 0L;

  for (long i = 1, h = getHexNr(i); i <= hnr; i++, h = getHexNr(i)) 
   if (h % 20 == 0 && h % 19 == 0 && h % 18 == 0 && h % 17 == 0
    && h % 16 == 0 && h % 14 == 0 && h % 13 == 0 && h % 11 == 0) count++;

  System.out.println(count);
}
publicstaticvoidmain(字符串[]args){
长hnr=100000000升,计数=0升;
对于(长i=1,h=getHexNr(i);i 1&&argv[1][0]=='1'){
对于(;++i 1&&argv[1][0]='2'){
对于(;++i 1&&argv[1][0]='3'){
对于(;++i 1&&argv[1][0]='4'){

对于(++i),如果你用简单的词或伪代码来描述你所使用的算法可能比较容易,我发现很难考虑这个问题,而不知道为什么第一个解决方案应该工作。它将整数倍乘以十六进制(10m)的非整数,当被馈入十六进制数发生器时,输出LCM。(1..20),对吗?有整数倍存在吗,或者2x^2-x=lcm(1..20)的解是无理的吗?如果它们存在,它们与1..20可除十六进制数有什么关系?真的,你只需要检查每个素数的最大幂是否小于20-2^4(16),3^2(9),5,7,11,13,17,19。您的列表不会捕获不能被13整除的数字,并且会重复检查一些内容。(例如,任何可以被15和16整除的数字也必须被20和12整除。)@奇怪的是,我一定是偶然错过了13。我实际上在想,任何可以被20和18整除的数字也一定可以被15和12整除,但这是类似的想法。
 static long gcd(long a, long b) {
  if (b == 0) return Math.abs(a);
  return gcd(b, a % b);
 }

 static long lcm(long a, long b) {
  return (a * b) / gcd(a, b);
 }

 static long getHexNr(long n) {
  return n * (2 * n - 1);
 }

 static double[] getQES(long a, long b, long c) {
  double d = b * b - 4 * a * c;
  if (d < 0) return new double[0];
  return new double[] { (-b + Math.sqrt(d)) / (2 * a),
    (-b - Math.sqrt(d)) / (2 * a) };
 }
public static double round(double d, int nr) {
    return new BigDecimal(Double.toString(d)).setScale(nr,
        BigDecimal.ROUND_HALF_UP).doubleValue();
}
((tmp += qes) % 1 == 0)
public static void main(String[] args) {
  long hnr = 100000000L, count = 0L;

  for (long i = 1, h = getHexNr(i); i <= hnr; i++, h = getHexNr(i)) 
   if (h % 20 == 0 && h % 19 == 0 && h % 18 == 0 && h % 17 == 0
    && h % 16 == 0 && h % 14 == 0 && h % 13 == 0 && h % 11 == 0) count++;

  System.out.println(count);
}
include <stdio.h>
#define H(n) (n*(2ULL*n-1ULL))
#define limit 100000000ULL
int main(int argc, char** argv){
  unsigned long long int count=0, i = 1, h = 1;
  if(argc>1&&argv[1][0]=='1'){
    for (; ++i <= limit; h = H(i)) {
     if (h % 19 == 0 && h % 17 == 0 && h % 16 == 0 && h % 13 == 0
      && h % 11 == 0 && h %  9 == 0 && h %  7 == 0 && h %  5 == 0) count++;
    }
  } else if(argc>1&&argv[1][0]=='2'){
    for (; ++i <= limit; h = H(i)) {
     if (h % 20 == 0 && h % 19 == 0 && h % 18 == 0 && h % 17 == 0
      && h % 16 == 0 && h % 14 == 0 && h % 13 == 0 && h % 11 == 0) count++;
    }
  } else if(argc>1&&argv[1][0]=='3'){
    for (; ++i <= limit; h = H(i)) {
     if (h %  5 == 0 && h %  7 == 0 && h %  9 == 0 && h % 11 == 0
      && h % 13 == 0 && h % 16 == 0 && h % 17 == 0 && h % 19 == 0) count++;
    }
  } else if(argc>1&&argv[1][0]=='4'){
    for (; ++i <= limit; h = H(i)) {
     if (h % 11 == 0 && h % 14 == 0 && h % 14 == 0 && h % 16 == 0
      && h % 17 == 0 && h % 18 == 0 && h % 19 == 0 && h % 20 == 0) count++;
    }
  } else {
    for (; ++i <= limit; h = H(i)) {
     if (h %  2 == 0 && h %  3 == 0 && h %  4 == 0 && h %  5 == 0
      && h %  6 == 0 && h %  7 == 0 && h %  8 == 0
      && h %  9 == 0 && h % 10 == 0 && h % 11 == 0
      && h % 12 == 0 && h % 13 == 0 && h % 14 == 0
      && h % 15 == 0 && h % 16 == 0 && h % 17 == 0
      && h % 18 == 0 && h % 19 == 0 && h % 20 == 0) count++;
    }
  }
  printf("%llu\n",count);
}