我正在處理問題12關於第一個三角形數字與500除數。我試圖強制解決方案。我在35秒內得到300個除數,在10分鐘內無法獲得400個除數。我將改變我的解決方案以使用主因子方法,但我現在已經看到,人們仍然在一分鐘之內以強力的方式獲得這個解決方案。項目歐拉問題12 - C + +
您可以批評我的代碼,並告訴我是否錯過了使這種可怕的低效率的東西?
unsigned long long TriangleNumberDivisors(int divisorTarget)
{
unsigned long long triangleNum=1;
unsigned long long currentNum=2;
int numOfDivisors=0;
numOfDivisors=NumOfDivisors(triangleNum);
while(numOfDivisors<divisorTarget)
{
triangleNum+=currentNum;
currentNum++;
numOfDivisors=NumOfDivisors(triangleNum);
}
return triangleNum;
}
int NumOfDivisors(unsigned long long dividend)
{
int numDivisors=0;
set<unsigned long long> divisors;
set<unsigned long long>::iterator it;
for(unsigned long long index=1; index<=dividend/2; index++)
{
if(dividend%index==0)
{
divisors.insert(index);
numDivisors++;
it=divisors.find(dividend/index);
if(it==divisors.end())
{
divisors.insert(dividend/index);
numDivisors++;
}
/*for some reason not checking for dups above and
just checking for how many items are in the set at the end is slower
for(it=divisors.begin();it!=divisors.end();it++)
{
numDivisors++;
}
*/
}
}
return numDivisors;
}
int main()
{
cout<<TriangleNumberDivisors(500)<<endl;
return 0;
}
更新:明白了,謝謝。改爲只檢查數字的平方根,並進行了額外的檢查,看看它是否是一個完美的正方形。這讓我也完全刪除了這個集合。在12秒內跑出500個因子。
請在'=','<','=='周圍放置空格。 otherwiseitisverydifficulttoread。 – Arun 2010-09-27 22:00:05
請閱讀我對同一個問題的回答:http://stackoverflow.com/questions/3273379/understanding-some-math-relating-to-euler-12/3273405#3273405 :) – AraK 2010-09-27 22:02:06