剑指Offer第41题(和为s的两个数字VS和为s的连续正数序列)

本文提供了一种算法,用于在递增排序的数组中找到两个数,其和等于给定值。此外,还介绍了如何找出所有和为特定值的连续正数序列,包括多个实例,如15=1+2+3+4+5=4+5+6=7+8。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(本博客旨在个人总结回顾)

题目描述:

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

       例如输入数组{1,2,4,7,11,15}和数字15。由于4+11=15,因此输出4和11.

 

源码:

#include "stdafx.h"
#include<iostream>
using namespace std;

/*
 * @name   FindNumbersWithSum
 * @brief  找到递增数组中和为nSum的元素nNum1和nNum2
 * @param  [in] int * pArr
 * @param  [in] int nLength
 * @param  [in] int nSum
 * @param  [in] int & nNum1
 * @param  [in] int & nNum2
 * @return bool
 */
bool FindNumbersWithSum(int* pArr, int nLength, int nSum, int& nNum1, int& nNum2)
{
    bool bFound = false;

    if (NULL == pArr
        || nLength < 2)
    {
        return bFound;
    }

    int nLeft = 0;
    int nRight = nLength - 1;

    while (nLeft < nRight)
    {
        if (pArr[nLeft] + pArr[nRight] == nSum)
        {
            nNum1 = pArr[nLeft];
            nNum2 = pArr[nRight];
            bFound = true;
            break;
        }
        else if (pArr[nLeft] + pArr[nRight] < nSum)
        {
            nLeft++;
        }
        else
        {
            nRight--;
        }
    }

    return bFound;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int arr1[] = {1, 2, 4, 7, 11, 15};
    int nLength = sizeof(arr1) / sizeof(arr1[0]);
    int nNum1 = 0;
    int nNum2 = 0;
    if (FindNumbersWithSum(arr1, nLength, 15, nNum1, nNum2))
    {
        cout << "num1:" << nNum1 << "\tnum2:" << nNum2 << endl;
    }
    else
    {
        cout << "搜索失败!" << endl;
    }
    system("pause");
    return 0;
}

运行结果:

题目二:

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值