我试图获得超过400个除数的第一个三角形数字(三角数例如:1,3,6,10)。例如,3号三角形有四个除数1,2,3,6。以下是我尝试获得400除数的三角数
import java.math.BigInteger;
public class IQ3
{
static int num1 = 1;
static int devideResult = 0;
public static void main(String[]args)
{
while(true)
{
int triangle = num1*(num1+1)/2;
if(devide(triangle))
{
break;
}
num1++;
}
}
static boolean devide(int num)
{
boolean result = false;
int devideCounter = 2;
for(int i=1;i<=num/2;i++)
{
if(num%i == 0)
{
devideCounter++;
System.out.println("Devide Counter: "+devideCounter);
//System.out.println("i number: "+i);
//System.out.println("input number: "+num);
if(devideCounter>400)
{
System.out.println("Number: "+num);
result = true;
break;
}
}
}
return result;
}
}
但是这需要很长时间,有时会崩溃。
然而,由于答案可能非常大,我想到了使用BigInteger。
import java.math.BigInteger;
public class IQ2P2
{
static BigInteger num1 = new BigInteger("1");
static BigInteger two = new BigInteger("2");
static BigInteger one = new BigInteger("1");
static BigInteger i = new BigInteger("1");
static BigInteger zero = new BigInteger("0");
static int devideResult = 0;
// static int devideCounter = 0;
public static void main(String[]args)
{
while(true)
{
BigInteger triangle = num1.multiply(num1.add(one)).divide(two);
if(devide(triangle))
{
break;
}
num1.add(one);
}
}
static boolean devide(BigInteger num)
{
boolean result = false;
int devideCounter = 2;
while((i.compareTo(num))<(num.divide(two).intValue()))
{
if(num.remainder(i) == zero)
{
devideCounter++;
System.out.println("Devide Counter: "+devideCounter);
//System.out.println("i number: "+i);
//System.out.println("input number: "+num);
if(devideCounter>400)
{
System.out.println("Number: "+num);
result = true;
break;
}
}
i.add(one);
}
return result;
}
}
但是那个大佬从来没有回过头来。
请帮助我获得超过400个除数的第一个三角形数字。
注意:这不是作业。我不是学生。
以下是对答案的回复
import java.math.BigInteger;
public class IQ2
{
static long num1 = 1;
static long numberToAdd = 0;
static long devideResult = 0;
static long triangleNum = 1;
static long incrementer = 2;
// static int devideCounter = 0;
public static void main(String[]args)
{
while(true)
{
triangleNum += incrementer++;
if(devide(triangleNum))
{
break;
}
num1++;
}
}
static boolean devide(long num)
{
boolean result = false;
int devideCounter = 2;
for(long i=1;i<=num/2;i++)
{
if(num%i == 0)
{
devideCounter++;
System.out.println("Devide Counter: "+devideCounter);
//System.out.println("i number: "+i);
//System.out.println("input number: "+num);
if(devideCounter>400)
{
System.out.println("Number: "+num);
result = true;
break;
}
}
}
return result;
}
}
答案 0 :(得分:1)
由于没有真正的规则或模式来确定第i个三角形数具有多少除数,所以你必须从头开始并测试每个数字。
所以优化(在我看来)只能在“有多少个除数有这个数字”的问题上进行。
您只能检查所有素数(在检查期间建立素数集)。这会显着减少时间,虽然我不知道这是否已经是最快的解决方案(我对此表示怀疑)。
答案 1 :(得分:1)
你需要优化你找出给定数字的除数的方式。首先,对于每个d <= sqrt(n)
n%d==0
,m=n/d
n%m==0
和m >= sqrt(n)
。这意味着您可以同时计算两者,停在sqrt(n)
。
但真正的优化是计算数字的prime factorization,然后从那里找出amount of divisors。