使用双层for循环进行遍历,获得所有可能的分解长度
#include <iostream>
#include <list>
using namespace std;
// 数的分解
static void HuaWei_OD_test16(void)
{
int num;
cin >> num;
list<int> divide_len_list;
bool divide_len_has_2 = false; // 是否有两个相邻元素相加等于num
for (int i = 1; i < num; i++)
{
// 对于21来说,11+12就大于21,后续的就不进行遍历了
if (2 * i + 1 > num && divide_len_has_2)
{
break;
}
int sum = 0;
for (int j = i; j < num; j++)
{
if (sum < num)
{
sum += j;
}
else if (sum > num)
{
break;
}
else
{
// sum == num, 记录一次
if (j - i == 2)
{
divide_len_has_2 = true;
}
divide_len_list.push_back(j - i);
break;
}
}
}
divide_len_list.sort();
cout << divide_len_list.front() << endl;
}
int main()
{
HuaWei_OD_test16();
return 0;
}