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