• 和为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
    ", num1, num2);
            else
            printf("Failed.
    ");
        }
        else
            printf("Failed.
    ");
        
        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("
    ");
    40 }
    41 
    42 int main(int argc, char const *argv[])
    43 {
    44     int sum = 9;
    45     printf("test for %d:
    ", sum);
    46     FindContinuousSequence(sum);
    47     
    48     sum = 15;
    49     printf("test for %d:
    ", sum);
    50     FindContinuousSequence(sum);
    51     
    52     sum = 100;
    53     printf("test for %d:
    ", sum);
    54     FindContinuousSequence(sum);
    55 
    56     return 0;
    57 }

  • 相关阅读:
    《C++ Primer Plus》15.1 友元 学习笔记
    《C++ Primer Plus》14.4 类模板 学习笔记
    《C++ Primer Plus》14.3 多重继承 学习笔记
    《C++ Primer Plus》14.2 私有继承 学习笔记
    《C++ Primer Plus》第13章 类继承 笔记
    继承和动态内存分配——需要为继承类定义 显式析构函数、复制构造函数和赋值运算符
    C++中的抽象基类示例
    C++ 在继承中使用virtual
    《C++ Primer Plus》第12章 类和动态内存分配 学习笔记
    《C++ Primer Plus》12.7 队列模拟 学习笔记
  • 原文地址:https://www.cnblogs.com/sankexin/p/5636080.html
Copyright © 2020-2023  润新知