首页 > 其他分享 >58. 区间和

58. 区间和

时间:2024-10-30 17:46:47浏览次数:5  
标签:58 int scanf cin while 区间 EOF cout

题目

本人一开始是这样写的:

#include <iostream>

using namespace std;

const int N = 100010;
int n;
int s[N];

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++ )
    {
        int x;
        cin >> x;
        s[i] = s[i - 1] + x;
    }
    
    int l = 0, r = 0;
    while (cin >> l && cin >> r)
    {
        cout << s[r + 1] - s[l + 1] << endl;
    }
    return 0;
    
}

发现结果不对。

仔细再看了一遍代码,发现是 cout << s[r + 1] - s[l + 1] << endl;这一句的问题,应该改成cout << s[r + 1] - s[l] << endl;,即l + 1那个位置的数也是在区间[l + 1 , r + 1]里的,也要加上。

改成这样就对了:

#include <iostream>

using namespace std;

const int N = 100010;
int n;
int s[N];

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++ )
    {
        int x;
        cin >> x;
        s[i] = s[i - 1] + x;
    }
    
    int l = 0, r = 0;
    while (cin >> l && cin >> r)
    {
        cout << s[r + 1] - s[l] << endl;
    }
    return 0;
    
}

再补充一个点(在卡哥写的题解上看到的):

C++ 代码 面对大量数据 读取 输出操作,最好用scanf 和 printf,耗时会小很多

于是将代码改成这样:

#include <iostream>

using namespace std;

const int N = 100010;
int n;
int s[N];

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++ )
    {
        int x;
        scanf("%d", &x);
        s[i] = s[i - 1] + x;
    }
    
    int l = 0, r = 0;
    while (~scanf("%d %d", &l, &r))
    {
        printf("%d\n", s[r + 1] - s[l]);
    }
    return 0;
    
}

附上两次的耗时情况:

img

差距蛮明显的。

然后注意下这个while循环里面的条件while (~scanf("%d %d", &l, &r)),不要写成while (scanf("%d %d", &l, &r))

具体原因如下:

  1. scanf的返回值:

    • 当 scanf 成功读取两个整数时,返回值是 2(表示成功读取了两个项)。

    • 当遇到文件结束符(EOF)或者输入错误时,返回值是 EOF(通常是 -1)。

  2. 使用 ~ 操作符:

    • ~ 是按位取反运算符。它对整数的每一位进行反转。

    • 例如:

      • 如果 scanf 返回 2,那么 ~2 的结果是 -3(因为 ~2 反转了二进制的 2,得到 -3)。

      • 如果 scanf 返回 -1(即 EOF),那么 ~-1 的结果是 0(因为 ~-1 反转了 -1 的二进制,得到 0)。

  3. 循环条件的判断:

    while (~scanf("%d %d", &l, &r)) 中:

    • 当 scanf 成功读取两个整数(返回 2),条件为 while (~2),即 while (-3),这个条件为真,循环继续。

    • 当 scanf 返回 EOF(即 -1),条件为 while (~-1),即 while (0),这个条件为假,循环结束。

补充:

在 C 语言中,while 循环的条件判断是基于真值逻辑的:

  • 非零值为真:在 C 语言中,任何非零值都被视为真(true),而 0 被视为假(false)。

  • 负数也是非零:虽然 -3 是负数,但它仍然是非零,因此在条件判断中被视为真。换句话说,while (-3) 是一个真条件,循环会继续执行。

附上一篇博客cin和scanf的返回值知多少

标签:58,int,scanf,cin,while,区间,EOF,cout
From: https://www.cnblogs.com/hisun9/p/18516307

相关文章

  • [Python学习日记-58] 开发基础练习1——员工信息查询
    [Python学习日记-58]开发基础练习1——员工信息查询简介题目答案简介        该练习结合了函数和一些常用的模块开发了一个使用命令行交互的员工信息查询程序,可以巩固实践之前学习的内容。题目一、程序需求        现要求你写⼀个简单的员⼯信息增删......
  • RK3588J的6路MIPI CSI视频采集方案
    本文主要介绍基于RK3588J的6路高清视频采集案例,开发环境如下Windows开发环境:Windows764bit、Windows1064bit虚拟机:VMware15.5.5开发环境:Ubuntu20.04.664bitU-Boot:U-Boot-2017.09Kernel:Linux-5.10.160LinuxSDK:rk3588_linux_release_v1.2.1摄像头模块型号:TL138......
  • 北京迅为iTOP-3588开发板网络环境配置电脑、开发板直连交换机或路由器
    北京迅为iTOP-3588开发板网络环境配置电脑、开发板直连交换机或路由器   RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES1.1、2.0和3.2。RK3588引入了新一代......
  • 触觉智能SOM3588S鸿蒙核心板现已上市,RK3588S八核6T超高算力!
    深圳触觉智能SOM3588S鸿蒙核心板现已上市,搭载瑞芯微RK3588S旗舰芯片,是一款高算力、低功耗,丰富多媒体接口的高性能核心板。SOM3588S鸿蒙核心板集成了四核Cortex-A76和四核Cortex-A55CPU,6T超高算力NPU,G610MP4GPU;拥有8K视频编解码与4800万像素ISP的强大视频图像处理性能;支持HDMI......
  • st求区间
    点击查看代码/*台州第一深情*/#include<bits/stdc++.h>usingnamespacestd;usingi64=long;usingll=longlong;typedefpair<int,int>PII;constintN=1e5+5;intn,t;inta[N],max1[N][25],min1[N][25];//max1[i][j]表示以i结尾,长度为2^j的子序列......
  • 代码随想录算法训练营day30| 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.
    学习资料:https://programmercarl.com/0452.用最少数量的箭引爆气球.html重叠区域问题最远位置问题452.用最少数量的箭引爆气球(重叠区域;按左边界排序;i区间的左边界与i-1区间的右边界比较来确定是否重叠;更新i的右边界,取i与i-1区域右边界的最小值)点击查看代码classSolution(ob......
  • 7.1 在区间[0,10]上等间距取1000个点Xi(i为下标,i=1,2,3,...,1000),并计算在这些点Xi处函
    importnumpyasnpimportscipy.interpolateasspiimportscipy.integrateasspi_integratedefg(x):return((3x**2+4x+6)*np.sin(x))/(x**2+8*x+6)x_values=np.linspace(0,10,1000)y_values=g(x_values)spline=spi.CubicSpline(x_values,y_v......
  • AcWing 802:区间和 ← 离散化
    【题目来源】https://www.acwing.com/problem/content/804/【题目描述】假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行n次操作,每次操作将某一位置x上的数加c。接下来,进行m次询问,每个询问包含两个整数l和r,你需要求出在区间[l,r]之间的所......
  • 新品上市|EVB3588S开发板,瑞芯微RK3588S八核芯,6T高算力,丰富音视频接口,开发评估快人一步
    深圳触觉智能EVB3588S开发板正式上市,搭载瑞芯微RK3588S旗舰芯片,八核处理器、主频最高2.4Ghz,6T高算力NPU;支持8K视频编解码与三屏异显输出;4G/5G/WIiFi/蓝牙无线通信功能,接口丰富,评估事半功倍,效率快人一步!国产旗舰芯EVB3588S开发板采用瑞芯微最新旗舰SOC芯片RK3588S。RK3588S是一款......
  • CF1158B The minimal unique substring
    这题是有迹可循的!下面从一个思考者的角度讲述解题方法。首先这两条限制很奇怪,但感觉都是很强的性质。所以这道题光想入手都是比较难的,先考虑怎么入手。第二条限制相对简单,先考虑第二条限制。我们注意到,如果一个串的数字全是\(1\),显然可以满足限制一。那限制二我们考虑将一个\(......