// Problem 28
// 11 October 2002
//
// Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows:
//
// 21 22 23 24 25
// 20 7 8 9 10
// 19 6 1 2 11
// 18 5 4 3 12
// 17 16 15 14 13
//
// It can be verified that the sum of the numbers on the diagonals is 101.
//
// What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way?
#include <iostream>
#include <windows.h>
using namespace std;
// 获取指定边长所需数的数目
// 边长为1,则总数为1
// 边长为3,则总数为5
// 边长为5,则总数为9
// 边长为range,则总数为 2 * range - 1
inline int NumCountOfRange(int range)
{
return 2 * range - 1;
}
void F1()
{
cout << "void F1()" << endl;
LARGE_INTEGER timeStart, timeEnd, freq;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&timeStart);
const int range = 1001; //正方形边长
int numCount = NumCountOfRange(range); //总共要相加的数
int currNum = 1; //当前计算的数
int addNum = 0; //当前增量,每多一圈,自增2
int sum = 1; //结果
int j = 0; //内循环,减少定义开销
for(int i = 1; i < numCount; i += 4) //已经加的个数,每圈增加4个数
{
addNum += 2;
for(j = 0; j < 4; j++) //当前圈的4个值
{
currNum += addNum;
sum += currNum;
}
}
cout << "边长为" << range << "的对角线的数字相加结果为:" << sum << endl;
QueryPerformanceCounter(&timeEnd);
cout << "Total Milliseconds is " << (double)((double)(timeEnd.QuadPart - timeStart.QuadPart) * 1000 / (double)freq.QuadPart) << endl;
}
//主函数
int main()
{
F1();
return 0;
}
/*
void F1()
边长为1001的对角线的数字相加结果为:669171001
Total Milliseconds is 23.3593
By GodMoon
2011年10月30日17:24:42
*/
【ProjectEuler】ProjectEuler_028
最新推荐文章于 2024-04-15 10:46:09 发布