和为S的数字
57.1输入一个递增数组和一个数字S,在数组中找两个数字使其和为S,如果有多对数字,输出一对即可
解法一:蛮力法,逐次累加
解法二:利用递增特点,从两边试探加起,如果两数字和大于S,右侧往左移动,如果两数字小于S,左侧往右移,直至找到一对数
bool FindNumbersWithSum(int data[], int length, int sum,int* num1, int* num2)
{
if (data == nullptr || length <= 1 || num1==nullptr || num2==nullptr) return false;
int start = 0;
int end = length - 1;
while (data[end] > sum) end--;
while (start<end)
{
if (data[start] + data[end]>sum) end--;
else if (data[start] + data[end] < sum) start++;
else
{
*num1 = data[start];
*num2 = data[end];
return true;
}
}
return false;
}
57.2和为s的连续正数数列,输入一个正数S,打印出所有和为S的连续正数数列(至少两个)
解法一:蛮力法,从1开始依次递减,能够成功减为0的数字则输出,否则从下一位重新开始,复杂
解法二:因为是连续的数字,最大的两个数应该在中间,如果s为偶数,数组内的值不大于x=s/2,如果S为奇数,数组内的值不大于x=(s+1)/2
从x开始作为右节点数,试探地移动左侧节点数,如果两节点数之间和大于S,右节点左移动,如果两节点数之间和小于S,左节点左移动,直至和为S,左节点为0,返回
void FindContinuousSequence(int sum)
{
if (sum <= 2) return;
int big = 0;
if (sum & 1)
big = (sum + 1) >> 1;
else
big = sum >> 1;
int small = big - 1;
int tempSum = big + small;
while (small>0)
{
if (small==big)
{
small--;
tempSum += small;
}
else if (tempSum>sum)
{
tempSum -= big;
big--;
}
else if (tempSum<sum)
{
small--;
tempSum += small;
}
else
{
for (int i = small; i <= big;i++)
printf("%d,", i);
printf("\n");
tempSum -= big;
big--;
}
}
return;
}