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

来源:互联网 发布:风险分析矩阵图 编辑:程序博客网 时间:2024/05/17 08:46
/*题目1:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。题目2:输入一个正数,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15, 由于1 + 2 + 3 + 4 + 5 =4 + 5 + 6 = 7 + 8 = 15, 所以结果打印出3个连续序列1 ~ 5, 4 ~ 6和7 ~ 8。*/#include <iostream>using namespace std;//和为Sum的两个数字bool FindTwoNumbersWithSum(int data[], int nlength, int &num1, int &num2, int Sum){    bool found = false;    if(data == NULL || nlength < 1)    return found;    int aHead = 0;    int Behind = nlength - 1;    while(aHead < Behind)    {        int curSum = data[aHead] + data[Behind];        if(curSum == Sum)        {            num1 = data[aHead];            num2 = data[Behind];            found = true;            break;        }else if(curSum < Sum)        aHead++;        else        --Behind;    }    return found;}//输出连续数字void PrintContinousSequence(int small, int big){    while(small <= big)    {        cout << small << " ";        ++small;    }    cout << endl;}//和为Sum的连续整数序列void FindNumbersWithContinuousSequence(int Sum){    if(Sum < 3)    return;    //初始化    int small = 1;    int big = 2;    int curSum = small + big;    int middle = (Sum + 1) / 2;    while(small < middle)    {        if(curSum == Sum)        PrintContinousSequence(small, big);        while(curSum < Sum && small < middle)        {            big++;            curSum += big;            if(curSum == Sum)            PrintContinousSequence(small, big);        }        curSum -= small;        small++;    }}//=======================测试代码====================void Test(char *TestName, int data[], int nlength, int Sum, bool Expected){    if(TestName != NULL)    cout << TestName << " Begins:" << endl;    int num1 = 0;    int num2 = 0;    bool Result = FindTwoNumbersWithSum(data, nlength, num1, num2, Sum);    if(Result == Expected)    {        if(Result)        {            if(num1 + num2 == Sum)            cout << "Passed!" << endl;            else            cout << "Failed!" << endl;        }else        cout << "Passed!" << endl;    }    else    cout << "Failed!" << endl;}//=======================测试代码B===========================void TestB(char *TestName, int Sum){    if(TestName != NULL)    cout << TestName << " for " << Sum << " Begins:" << endl;    FindNumbersWithContinuousSequence(Sum);}//=====================测试用例========================//存在和为Sum的数对,且在数组中间void Test1(){    int data[] = {1, 2, 4, 7, 11, 15};    Test("Test1", data, sizeof(data) / sizeof(int), 15, true);}//存在和为Sum的数对且在数组两端void Test2(){    int data[] = {1, 2, 4, 7, 11, 16};    Test("Test2", data, sizeof(data) / sizeof(int), 17, true);}//不存在和为Sum的数对void Test3(){    int data[] = {1, 2, 4, 7, 11, 16};    Test("Test3", data, sizeof(data) / sizeof(int), 10, false);}//鲁棒性测试void Test4(){    Test("Test4", NULL, 0, 10, false);}int main(){    Test1();    Test2();    Test3();    Test4();    TestB("Test1", 1);    TestB("Test2", 3);    TestB("Test3", 4);    TestB("Test4", 9);    TestB("Test5", 15);    TestB("Test6", 100);    return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上课不专心听怎么办 做作业总是走神怎么办 做事注意力不集中怎么办 做事注意力不能集中怎么办 幼儿争抢玩具老师怎么办 孩子不专心学习怎么办 一年级孩子学习边学边忘怎么办 对爱不专心怎么办 孩子脑子不灵活怎么办 小孩写作业心慌怎么办 4岁写数字怎么办 孩子做事太慢怎么办 小孩子做事不认真怎么办 员工做事不认真怎么办 做事总是不认真怎么办 孩子上课老是讲话怎么办 孩子上课总讲话怎么办 孩子不求上进怎么办 孩子只知道吃完怎么办 孩子演出前紧张怎么办 儿童写字不专心怎么办 孩子上课没精神怎么办 小孩写字太慢怎么办 儿童上课不集中怎么办 突然头晕迷糊眼花怎么办 自己上课不专心怎么办 颈椎病头晕怎么办才好 孩孑记忆力不好怎么办 上课的时候困怎么办 小学生写字太慢怎么办 一年级小学生写字慢怎么办 小学生写字太用力怎么办 专注力不集中怎么办 一年级孩子写字慢怎么办 孩子话很多应该怎么办 孩子废话特别多怎么办 老师不认真教学怎么办 小孩脸上长痦子怎么办 小朋友爱讲笑话怎么办 小孩上课不认真怎么办 小孩子精神不集中怎么办