// 面试题57(一):和为s的两个数字
// 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们
// 的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
static bool get_sum_nums(std::vector<int>& arr, int sum, int& num1, int& num2)
{
if(arr.size()<2)
{
return false;
}
uint32_t start = 0;
uint32_t end = arr.size() - 1;
while(end > start)
{
long long temp = arr[start] + arr[end];
if(temp == sum)
{
num1 = arr[start];
num2 = arr[end];
return true;
}
else if(temp > sum)
{
end--;
}
else
{
start++;
}
}
return false;
}
// 面试题57(二):和为s的连续正数序列
// 题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。
// 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。
static void find_sequence(uint32_t sum, std::vector<std::vector<uint32_t>>& matrix)
{
uint32_t small = 1;
uint32_t big = 2;
uint32_t middle = (1 + sum) / 2;
uint32_t temp = small + big;
while(big <= middle)
{
if(temp == sum)
{
_add(small, big, matrix);
}
if (temp > sum && small < big)
{
temp -= small;
small ++;
}
else
{
big++;
temp += big;
}
}
for(auto& a:matrix)
{
for(auto& i:a)
{
printf("%d\t", i);
}
printf("\n");
}
}
static void _add(uint32_t small, uint32_t big, std::vector<std::vector<uint32_t>>& arr)
{
std::vector<uint32_t> tmp;
for(auto i = small; i <= big; ++ i)
{
tmp.push_back(i);
}
arr.push_back(tmp);
}