和为S的两个数字VS和为S的连续正数序列

Posted 三颗心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了和为S的两个数字VS和为S的连续正数序列相关的知识,希望对你有一定的参考价值。

题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。

思路:最初我们找到数组的第一个数字和最后一个数字。首先定义两个指针,第一个指针指向数组的第一个(也就是最小的)数字,第二个指针指向数组的最后一个(也就是最大的)数字。当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于数字时,把较小的数字往后移动;当相等时,打完收工。这样扫描的顺序是从数组的两端向数组的中间扫描。

#include "stdafx.h"
#include<iostream>

bool FindNumbersWithSum(int data[], 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 behind = 0;

    while(ahead > behind)
    {
        long long curSum = data[ahead] + data[behind];

        if(curSum == sum)
        {
            *num1 = data[behind];
            *num2 = data[ahead];
            found = true;
            break;
        }
        else if(curSum > sum)
            ahead --;
        else
            behind ++;
    }

    return found;
}

int main()
{
    int data[] = {1,2,4,7,11,15};
    int length = sizeof(data)/sizeof(int);
    int sum = 15;
    int num1, num2;
    int result = FindNumbersWithSum(data, length, sum, &num1, &num2);
    if(result)
    {
        if(num1 + num2 == sum)
            printf("%d  %d\\n", num1, num2);
        else
        printf("Failed.\\n");
    }
    else
        printf("Failed.\\n");
    
    return 0;
}

 

 

 

题目:输入一个正数S,打印出所有和为S的连续正数序列(至少有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5,4~6和7~8.

思路:

两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2.如果从small到big的序列的和大于S,可以从序列中去掉较小的值,也就是增大small的值。如果从small到big的序列的和小于S,可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加small到(1+S)/2为止。

 1 #include "stdafx.h"
 2 
 3 void PrintContinuousSequence(int small, int big);
 4 
 5 void FindContinuousSequence(int sum)
 6 {
 7     if(sum < 3)
 8         return;
 9     
10     int small = 1;
11     int big = 2;
12     int middle = (1 + sum) / 2;
13     int curSum = small + big;
14     
15     while(small < middle)
16     {
17         if(curSum == sum)
18             PrintContinuousSequence(small, big);
19             
20         while(curSum > sum && small < middle)
21         {
22             curSum -= small;
23             small ++;
24             
25             if(curSum == sum)
26                 PrintContinuousSequence(small, big);
27         }
28         
29         big ++;
30         curSum += big; 
31     }
32 }
33 
34 void PrintContinuousSequence(int small, int big)
35 {
36     for(int i = small; i <= big ; i ++)
37         printf("%d ", i);
38 
39     printf("\\n");
40 }
41 
42 int main(int argc, char const *argv[])
43 {
44     int sum = 9;
45     printf("test for %d:\\n", sum);
46     FindContinuousSequence(sum);
47     
48     sum = 15;
49     printf("test for %d:\\n", sum);
50     FindContinuousSequence(sum);
51     
52     sum = 100;
53     printf("test for %d:\\n", sum);
54     FindContinuousSequence(sum);
55 
56     return 0;
57 }

以上是关于和为S的两个数字VS和为S的连续正数序列的主要内容,如果未能解决你的问题,请参考以下文章

和为S的两个数字VS和为S的连续正数序列

和为s的连续正数序列

和为S的连续正数序列

剑指Offer对答如流系列 - 和为s的数字

剑指 Offer 57 - II. 和为s的连续正数序列

LeetCode-滑动窗口和为s的连续正数序列