题意要求为输入n,m两个数,求解在1-n内满足连续和为m的区间。
设区间的端点为a,b。我觉得亮点一是利用c=b-a,这样可以将循环从两个变成一个,时间复杂度大大减小。亮点二是使用了STL库中的map,将结果储存在map中,然后输出。
for循环中判断条件是最重要的,其他很简单了。
#include<stdio.h>
#include<map>
using namespace std;
int main() {
int n, m, c, a;
map<int, int>stamp;
map<int, int>::iterator it;
scanf("%d %d", &n, &m); // 因为c=b-a,[a,b]区间的和为(b-a+1)(b+a)/2 = m即为(2a+c)(c+1)=2m
for (c = 0 ; c * c < 2 * m ; c++) {
if (2 * m % (c + 1) == 0 // 保证a为整数
&& 2 * m / (c + 1) - c != 0 // 保证a不为0
&& ((2 * m)/ (c+1) - c ) % 2 == 0) { // 保证2*a是偶数
a = (2 * m / (c + 1) - c) / 2;
if (a + c <= n)
stamp.insert(pair<int, int>(a, a+c));
}
}
for (it = stamp.begin() ; it != stamp.end() ; it++) {
printf("[%d,%d]\n", it->first, it->second);
}
return 0;
}