码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-12-10 02:01:35      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:连续正数序列

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

分析:选择数组的两端,将其相加,然后与s比较,如果比s大,则将指向数组最后的向前移一位,如果小于s,则指向数组的第一位的向后移一位,然后继续这个过程。如果等于s,则输出这两个数。

实现:

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;
}

题目二:输入一个正数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时,big+1,如果大于s,则small+1,然后继续。如果相等,则输出序列。循环停止的条件是small增加到(1+s)/2. 实现:

void FindContinuousSequence(int sum)
{
    if(sum<3)
        return;
        
    int samll=1;
    int big=2;
    int middle=(1+sum)/2;
    int curSum=small+big;
    
    while(small<middle)
    {
        if(curSum==sum)
            PrintCountinuousSequence(small,big);
            
        while(curSum>sum&&small<middle)
        {
            curSum-=small;
            small++;
            if(curSum==sum)
                PrintCountinuousSequence(small,big);
        }
        big++;
        curSum+=big;
        
    }
}

void PrintContinuousSequence(int small,int big)
{
    for(int i=small;i<=big;++i)
        printf("%d  ",i);
        
    printf("\n");
}



本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1588074

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

标签:连续正数序列

原文地址:http://secondscript.blog.51cto.com/9370042/1588074

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!