面试题41:和为s的两个数字 VS 和为s的连续正数序列

题目1:输入一个递增排序的数组和一个数字 s,在数组中查找两个数,得它们的和正好是 s。如果有多对数字的和等于 s,输出任意一对即可。
例如:输入数组{1 、2 、4、7 、11 、15 }和数字 15。由于 4+11 = 15 ,因此输出 4 和 11 。

/*************************************************************************
    > File Name: find_numbers_with_sum.cpp
    > Created Time: Thu 02 Jun 2016 12:18:54 PM PKT
 ************************************************************************/

#include<iostream>
using namespace std;

bool find_numbers_with_sum(int array[],int len,int sum,int &num1,int &num2)
{
    bool found=false;
    if(array==NULL || len<=0){
        return found;
    }

    int first=0;
    int last=len-1;
    while(first<last){
        int tmp=array[first]+array[last];
        if(tmp<sum){
            first++;
        }else if(tmp>sum){
            last--;
        }else{
            num1=array[first];
            num2=array[last];
            found=true;
            break;
        }
    }

    return found;
}

//测试
void test()
{
    int arr[6]={1,2,4,7,11,15};
    int sum=15;
    int num1=0;
    int num2=0;
    find_numbers_with_sum(arr,6,sum,num1,num2);
    cout<<num1<<ends<<num2<<endl;
}

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

bool print_numbers_with_sum(int sum)
{
    bool found=false;
    if(sum<3){
        return found;
    }

    int small=1;
    int big=2;
    int mid=(1+sum)/2;
    int tmp=small+big;
    while(small<mid){
        if(tmp<sum){
            big++;
            tmp+=big;
        }else if(tmp>sum){
            small++;
            tmp=tmp-(small-1);
        }else{
            for(int i=small;i<=big;i++){
                cout<<i<<ends;
            }
            cout<<endl;

            found=true;
            small++;
            tmp=tmp-(small-1);
        }
    }

    return found;
}

void test1()
{
    print_numbers_with_sum(9);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值