题目一:这道题题目为:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得他们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
解题思路分为三个步骤:
(1)对于已经排好序的数组,先在数组里随机选择两个数字,如果它们的和正好等于s,则输出这两个数字。
(2)如果随机选择的两个数字和小于s,可以选择较小数字后面比它大的数字。
(3)如果随机选择的两个数字和大于s,可以选择较大数字前面比它小的数字。
代码如下:
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
bool FindSum(int *number, int length, int sum, int *num1, int *num2)
{
bool found = false;
if (length < 1 || num1 == NULL || num2 == NULL)
return found;
int ahead = length - 1;
int second = 0;
while (ahead>second)
{
int curSum = number[ahead] + number[second];
if (curSum == sum)
{
*num1 = number[second];
*num2 = number[ahead];
found = true;
break;
}
else if (curSum > sum)
ahead--;
else
second++;
}
return found;
}
题目二:这道题题目为:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。
解题思路分为三个步骤:
(1)分别用small和big标记序列的最小值和最大值,其中将small初始化为1,big初始化为2。
(2)如果small到big的和大于s,可以去掉序列中较小的值,增大small的值,其中small值可以增加到(1+s)/2。
(3)如果small到big的和小于s,可以在序列中加入更多的数字,增大big的值。
代码如下:
#include<stdio.h>
#include<stdlib.h>
void FindSequence(int sum)
{
if (sum < 3)
return;
int small = 1;
int big = 2;
int middle = (1 + sum) / 2;
int curSum = small + big;
while (small < middle)
{
//找到和等于s序列
if (curSum == sum)
{
for (int i = small; i <= big; ++i)
{
printf("%d\n", i);
}
printf("\n");
}
//序列和小于或大于s
while (curSum>sum&&small < middle)
{
curSum -= small;
small++;
if (curSum == sum)
{
for (int i = small; i <= big; ++i)
{
printf("%d\n", i);
}
printf("\n");
}
}
big++;
curSum += big;
}
}