题目描述:给出N个数字,找出其中是否有三个数字之和为M(可重复选取),有就输出YES,没有就输出NO

样例输入:

5

1 3 4 5 7

8

//说明,第一行先输入一个数字,表示下一行有N个数字,第三行数字表示需要求的和M的值。

样例输出:YES

方法1:首先,我们肯定会想到用循环遍历,三个循环遍历出所有情况,然后挑选出符合的情况。

代码:

#include<stdio.h>
int main()
{
    int a[10],i,j,k,n,m;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            for(k=0;k<n;k++)
                if(i+j+k==m)
                {printf("YES"); goto over;}
over: if(i==n)
          printf("NO");
    return 0;
}

这样就解决了问题,但是显然三个循环有点多,遇上数字很多的话,可能就需要花费很多时间,那我们能不能想办法把时间减少呢?

方法2:如果数字很多,三重循环会花费非常多时间,那我们首先想到减少时间,就会想到去掉循环或者说减少循环。那我们先尝试减少一个循环。

首先第一个循环假设不动,那么剩下j,k需要我们用一个循环求出,也就是说我们需要用一个循环求出j+k==8-i。如果我们j,k都像之前那样从0到n-1,那肯定会错过很多种情况,那我们怎么才能不漏掉任何一种情况呢,这时候我们就会想到双向奔赴,从两头开始,这样就不会漏掉所有情况了。

拿上面实例举例,假设i=1已经求了,需要求j+k==8-i==7,这时j从1开始,k从7开始,显然这时候1+7大了,需要小一点,那就只能让k小一点,于是k下降到5,这时候1+5又小了,那就只能让j变大一点,于是j变成3,这时候3+5又大了,只能k变小一点,于是k变成4,正好合适了,输出yes。

如果没有j,k相遇了还没有找到,那说明没有结果。

#include<stdio.h>
int main()
{
    int a[10],i,j,k,n,m;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
    for(i=0;i<n;i++)
        for(j=0,k=n-1;j<=k;)
            if(a[j]+a[k]==m-a[i])
            {printf("YES");goto over;}
            else if(a[j]+a[k]>m-i)
                k--;
            else j++;
            
over: if(i==n)
          printf("NO");
    return 0;
}

(注意,数字需要先排好序,如果没有排序,需要先排序,本文按排好序处理)

代码有个地方敲错,a[j]+a[k]==m-i应改成m-a[i],已修改。

求多个数字之和为固定值相关推荐

  1. 编程笔试(解析及代码实现):求不重复数字之和​​​​​​​给定一组整型数字,里面有且仅有两个数字值出现了一次,其他的数字都出现了两次。请写出程序求出这两个只出现了一次的数字之和

    编程笔试(解析及代码实现):求不重复数字之和给定一组整型数字,里面有且仅有两个数字值出现了一次,其他的数字都出现了两次.请写出程序求出这两个只出现了一次的数字之和 目录 题目描述 代码实现 题目描述 ...

  2. 求字符串里面数字之和

    无意看到别人面试问了很简单的问题,求字符串里面数字之和,所以自己来实现下. 例子: 比如字符串:aaaa13sseui9ddu78ff4sss 里面的字符串数字是13.9.78.4 得到的和为104 ...

  3. 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值

    我觉得写得很清晰,希望没有侵犯作者的著作权,原文地址http://blog.csdn.net/hackbuteer1/article/details/6699642 快速找出一个数组中的两个数字,让这 ...

  4. 力扣解题——求根到叶子节点数字之和

    难度:中等 题目:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 123. 计算从根到 ...

  5. 1到1亿的自然数,求所有数的拆分后的数字之和

    1到1亿的自然数,求所有数的拆分后的数字之和,如286 拆分成2.8.6,如1到11拆分后的数字之和 => 1 + ... + 9 + 1 + 0 + 1 + 1 /*** 1到1亿的自然数,求 ...

  6. 叶子结点和分支节点_leetcode No.129 求根到叶子节点数字之和

    题目链接: 求根到叶子节点数字之和 - 力扣(LeetCode)​leetcode-cn.com 题目描述: 给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个 ...

  7. Java黑皮书课后题第6章:*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n)

    6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和.使用下面的方法头:public static int sumDigits(long n) 题目 题目概述 槽点 代码 运行示例 ...

  8. LeetCode Algorithm 129. 求根节点到叶节点数字之和

    129. 求根节点到叶节点数字之和 Ideas 从根节点到叶节点的路径可以通过递归得到,所以我们从根节点开始递归,每次递归的时候还带着一个参数表示从根节点到当前节点所组成的数字对应的字符串,最后如果到 ...

  9. 求整数的位数及各位数字之和(C语言)

    对于给定的正整数N,求它的位数及其各位数字之和. 输入格式: 输入在一行中给出一个不超过10^9​的正整数N. 输出格式: 在一行中输出N的位数及其各位数字之和,中间用一个空格隔开. 输入样例: 32 ...

最新文章

  1. 微信的Bug差点让我被老板炒鱿鱼!
  2. hdu 3579(中国剩余定理非互质)
  3. 拟真机器人拯救者奖励_冒险岛新版本拟真机器人什么样 新版本攻略
  4. python单元测试断言_Python单元测试框架之pytest -- 断言-阿里云开发者社区
  5. Poj 1503 Integer Inquiry
  6. 从 Web1.0 到 3.0 你不知道的互联网的演进史!
  7. CEF使用的几个注意点
  8. java List的初始化
  9. 现代信息检索——布尔检索
  10. 【蓝凌表单】流程表单JS汇总
  11. 结构型模式-装饰者模式
  12. AR互动大屏项目实战
  13. 网络类型—p2p、MA(BMA广播型多路访问、NBMA非广播型多路访问)
  14. ubuntu qt平台搭建openssl开发环境
  15. ubuntu16安装中文输入法
  16. Grid-Based Route (Re-)Planning
  17. 【JavaScript 逆向】某道翻译接口逆向
  18. python提供数字类型包括_Python 语言提供的 3 个基本数字类型是( )_学小易找答案...
  19. showdoc mysql_showdoc
  20. 1030 Travel Plan (30 分)

热门文章

  1. 「业务架构」通过设计实现业务模型架构
  2. 基于macd、kdj、ma技术指标分析股票多空方向——应用开发4 分析技术指标一系列形态结果
  3. Oracle系统参数错误,Oracle spfile参数设置错误的处理方法
  4. 第十八届全国大学智能汽车竞赛秘书处技术专家组第一次会议
  5. 流媒体后视镜方案关键技术--失效模式控制
  6. Android错误代码返回,【已解决】JPUSH的回调返回错误代码6012
  7. 有关水果蔬菜的类型网站
  8. 江湖风云录-洛阳金刀门
  9. 统信桌面操作系统V20个人版(1010)发布,支持QQ、微信等流行应用
  10. Android Studio SQLite 数据库 增删改查 简单