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

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

#include <iostream>

using namespace std;

//复杂度为O(n)
bool findnumber(int data[],int length,int sum,int &num1,int &num2)
{
    bool found=false;
    if(data==NULL||length<1)
        return found;
    int low=0,high=length-1;
    while(low<high)
    {
        long long cursum=data[low]+data[high];
        if(cursum==sum)
        {
            num1=data[low];
            num2=data[high];
            found=true;
            break;
        }
        else if(cursum<sum)
            low++;
        else
            high--;
    }
    return found;

}

int main()
{
    int data[5]={1,3,6,8,9};
    int length=5,num1=0,num2=0,sum=1;
    bool found=findnumber(data,length,sum,num1,num2);
    cout<<found<<"  "<<num1<<"  "<<num2;
}

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

#include <iostream>

using namespace std;

void printnumber(int low,int high)
{
    for(int i=low;i<=high;i++)
        cout<<i<<" ";
    cout<<'\n';
}

void findnumber(int sum)
{
    if(sum<3)
        return;
    int low=1,high=2,middle=(1+sum)/2,cursum=low+high;
    while(low<middle) //注意low,非high,s=偶数
    {
        if(cursum==sum)
            printnumber(low,high);
        while(cursum>sum&&low<middle)
        {
            cursum-=low;
            low++;
            if(cursum==sum)
                printnumber(low,high);
        }
        high++;
        cursum+=high;
    }
}

int main()
{
    findnumber(9);
}

 

posted @ 2017-07-16 16:11  home普通的人  阅读(169)  评论(0编辑  收藏  举报