在这里看到这个题目:http://community.csdn.net/Expert/TopicView3.asp?id=5664475
有人说是去年百度之星的一道初试题, so ,做做。。
有人说是去年百度之星的一道初试题, so ,做做。。
//
2007-07-23
// By rappizit@yahoo.com.cn
// 题目:
// 输入一个正数n,输出所有和为n连续正数序列。
// 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,
// 所以输出3个连续序列1-5、4-6和7-8。
// 分析:
// 假设 a + ... + b = n, 那么 (b - a + 1) * (a + b) = 2 * n.
// 显然 a!= b, 且 b - a + 1 < a + b, 且这两个数的奇偶性不一样。
// 尝试把 2 * n 分解因子,如果能分解成一奇一偶的因子,那么较小因子 i 作为 b - a + 1,
// 较大因子 j 作为 a + b, 那么 a = (j - i + 1) / 2, b = (i + j - 1) / 2。
// a 的大小和 j - i 是正相关的,如果要求输出的序列按 a 从小到大排序,
// 那么尝试的分解因子 i 从 root 开始迭代到 2
#include <iostream>
#include <math.h>
using namespace std;
void main ()
{
int n, n2, root, i, j, a, b, total = 0;
cin >> n;
n2 = n * 2;
root = (int) ((float) sqrt ((float) n2));
for (i = root; i >= 2; i --)
{
if ((n2 % i) == 0)
{
j = n2 / i;
if ((j % 2) ^ (i % 2))
{
// 因为 2 <= i <= root, 所以 i <= j
a = (j - i + 1) / 2;
b = (i + j - 1) / 2;
cout << a << " - " << b << endl;
total ++;
}
}
}
cout << "total : " << total << endl;
}
// By rappizit@yahoo.com.cn
// 题目:
// 输入一个正数n,输出所有和为n连续正数序列。
// 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,
// 所以输出3个连续序列1-5、4-6和7-8。
// 分析:
// 假设 a + ... + b = n, 那么 (b - a + 1) * (a + b) = 2 * n.
// 显然 a!= b, 且 b - a + 1 < a + b, 且这两个数的奇偶性不一样。
// 尝试把 2 * n 分解因子,如果能分解成一奇一偶的因子,那么较小因子 i 作为 b - a + 1,
// 较大因子 j 作为 a + b, 那么 a = (j - i + 1) / 2, b = (i + j - 1) / 2。
// a 的大小和 j - i 是正相关的,如果要求输出的序列按 a 从小到大排序,
// 那么尝试的分解因子 i 从 root 开始迭代到 2
#include <iostream>
#include <math.h>
using namespace std;
void main ()
{
int n, n2, root, i, j, a, b, total = 0;
cin >> n;
n2 = n * 2;
root = (int) ((float) sqrt ((float) n2));
for (i = root; i >= 2; i --)
{
if ((n2 % i) == 0)
{
j = n2 / i;
if ((j % 2) ^ (i % 2))
{
// 因为 2 <= i <= root, 所以 i <= j
a = (j - i + 1) / 2;
b = (i + j - 1) / 2;
cout << a << " - " << b << endl;
total ++;
}
}
}
cout << "total : " << total << endl;
}