我遇到Project Euler问题12.我的代码正确地生成了这个系列,据我所知,它得到了测试问题的正确解决方案。我不相信long
会溢出,因为它确实会返回一个解决方案,而不是正确的解决方案。有什么想法吗?
三角形数字的序列是 通过添加自然生成 数字。所以第7个三角形数字 将是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.前十个任期将是:
1,3,6,10,15,21,28,36,45,55, ...
让我们列出第一个因素 七个三角形数字:
1:1 3:1,3 6:1,2,3,6 10:1,2,5,10 15:1,3,5,15 21:1,3,7,21 28: 1,2,4,7,14,28我们可以看到28是 要结束的第一个三角形数字 五个除数。
第一个的价值是多少? 三角形数量超过五个 一百个除数?
class Program
{
static long lastTriangle = 1;
static void Main(string[] args)
{
long x = 1;
do
{
x = nextTriangle(x);
Console.WriteLine(x);
} while (numDivisors(x) < 500);
Console.WriteLine(x);
Console.ReadLine();
}
static long nextTriangle(long arg)
{
lastTriangle += 1;
long toReturn = lastTriangle + arg;
return toReturn;
}
static long numDivisors(long arg)
{
long count = 0;
long lastDivisor = 0;
Boolean atHalfWay = false;
for (long x = 1; x <= arg && !atHalfWay; x++)
{
if (arg % x == 0 && x != lastDivisor)
{
count++;
lastDivisor = arg / x;
}
else if (x == lastDivisor)
{
atHalfWay = true;
}
}
return count*2;
}
}
答案 0 :(得分:3)
如果x
是正方形,numDivisors
计算x
的平方根两次。
答案 1 :(得分:1)
问题不在于完美正方形的平方根被计算两次。当arg是一个正方形时,numDivisors(arg)
会给出一个完全错误的答案,而不仅仅是一个。考虑arg = 36
。当x = 4
时,lastDivisor设置为9.下一次迭代,x = 5;
if (36 % 5 == 0 && 5 != 9) // 36 % 5 == 1
else if (5 == 9)
// Nothing done, next x
if (36 % 6 == 0 && 6 != 9) // true
{
count++;
lastDivisor = 36 / 6; // 6
}
// next x
if (36 % 7 == 0 && 7 != 6) // 36 % 7 == 1
else if (7 == 6)
// next x
现在x永远不会等于lastDivisor,循环会一直运行到x == 36
,所以所有除数都会被计算两次。
你的条件while (numDivisors(x) < 500)
的另一个错误,问题是要求超过 500除数的第一个三角形数字,如果之前有一个正好有500个除数的那个,你会发现它。
为读者练习:为什么 - 在陈述的问题中 - 没有必要检查方块并只计算一次平方根?