题目:《编程之美》中的只考加法的面试题。
分析:给定的自然数n可以表示如下三种形式:
1. 偶数个连续自然数相加。
2个自然数相加 -- m + m+1 --> 2*m + 1
4个自然数相加 -- m-1 + m + m+1 + m+2 -->2*(2*m + 1)
...
2*k个自然数相加 -- m-k-1 .....+ m + ..... + m+k+1 -->k*(2*m + 1)
2. 奇数个连续自然数相加。
3个自然数相加 -- m-1 + m + m+1 --> 3*m
5个自然数相加 -- m-2 + m-1 + m + m+1 +m+2 --> 5*m
....
2*k+1个自然数相加 -- m-k + ... +m +...+ m+k --> (2*k+1)*m
3. 不能够用连续k个自然数相加。
void only_add(int n)
{
if (n <= 0)
return;
//odd numbers sum to n -- n = k*m [m-1 + m + m+1]
for (int i = 3; i < n/2; i += 2)
{
if (n % i == 0)
{
cout << "Odd! The sum of " << (n/i - i/2) << " - " << (n/i + i/2) << "is " << n << endl;
return;
}
}
//even numbers sum to n -- n = k(2m+1) [m-1 + m + m+1 + m+2]
for (int i = 2; i < n/2; ++i)
{
if ((n%i == 0) && ((n/i) & 1 ) && (n/i - i/2) > 0)// is odd?
{
cout << "Even! The sum of " << (n/i - 1)/2 - i/2 << " - " << (n/i - 1)/2 + i/2 + 1 << "is " << n << endl;
return;
}
}
cout << "Dear, can not find the sum of " << n << endl;
return;
}
这篇文章的解法也很好。
http://www.cnblogs.com/flyinghearts/archive/2011/03/27/1997285.html