第一次很容易想到的是枚举:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <cstring>
#include <ctype.h>
#include <iomanip>
#include <vector>
#include <array>
#include <limits.h>
#include <algorithm> //算法
#define N 100
using namespace std;
int main()
{
int n, m;
long long int sum = 0;
int num = 1;
while((scanf("%d %d",&n,&m)) != EOF)
{
if(n == 0 && m == 0)
{
break;
}
for(register int j = 1 ; j <= n ; j++)
{
if(j > n)
{
break;
}
for(register int i = j ; i <= n ; i++)
{
sum += i;
if(sum == m)
{
s = i;
cout << "[" << j << "," << i << "]" << endl;
break;
}
else if(sum > m)
{
break;
}
}
sum = 0;
}
if(n >= m)
{
cout << "[" << m << "," << m << "]" << endl;
}
cout << endl;
}
return 0;
}
这种情况你可以带入1000000000 1000000000会报错,只能缩小次数,提高效率
通过放缩减少循环次数,再减少一层循环保证高效到最佳状态:
以下是我放缩的结果:
如何减少循环呢
上代码
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <cstring>
#include <ctype.h>
#include <iomanip>
#include <vector>
#include <array>
#include <limits.h>
#include <algorithm> //算法
#define N 100
using namespace std;
int main()
{
int n, m;
while((scanf("%d %d",&n,&m)) != EOF)
{
// j 是 橡树
if(m == 0 && n == 0)
{
break;
}
for(int j = sqrt(2 * m) ; j > 0 ; j--)
{
int i = (2 * m / j + 1 - j) / 2;
if(i <= n && i + j - 1 <= n)
{
if((2 * i + j - 1) * j / 2 == m)
{
cout << "[" << i << "," << i + j - 1 << "]" << endl;
}
}
else
{
continue;
}
}
cout << endl;
}
return 0;
}
刚学程序不久,制作不易,希望观众大哥可以给点鼓励 感谢