Tôi đang làm việc về vấn đề 12 liên quan đến số tam giác đầu tiên với 500 ước. Tôi đã cố gắng giải quyết vấn đề. Tôi nhận được 300 ước trong khoảng 35 giây và không thể nhận được 400 trong vòng 10 phút. Tôi sẽ thay đổi giải pháp của mình để sử dụng phương pháp hệ số nguyên tố nhưng bây giờ tôi đã thấy rằng mọi người vẫn nhận được giải pháp này với lực lượng vũ phu trong chưa đầy một phút.Vấn đề dự án Euler 12 - C++
Bạn có thể phê bình mã của tôi và cho tôi biết nếu tôi thiếu thứ gì đó đang làm cho điều này không hiệu quả khủng khiếp?
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;
}
Cập nhật: Có ngay bây giờ, cảm ơn. Thay đổi để chỉ kiểm tra đến căn bậc hai của số, và đã làm một kiểm tra bổ sung để xem nếu nó là một hình vuông hoàn hảo. Điều này cho phép tôi xóa hoàn toàn bộ này. 500 divisors chạy trong 12 giây.
Hãy đặt khoảng trắng xung quanh '=', '<', '=='; otheritisverydifficulttoread. – Arun
Vui lòng đọc câu trả lời của tôi cho cùng một câu hỏi: http://stackoverflow.com/questions/3273379/understanding-some-math-relating-to-euler-12/3273405#3273405 :) – AraK