输出int型最大值、最小值的小妙招

如果在算法竞赛中要求输入数据是一个范围很大的数,而你又忘了int型的数据范围,这时该怎么办呢?

比如洛谷P1001号题目:

【题目描述】

输入两个整数a,b,输出它们的和(∣a∣,∣b∣≤10^9)。

【输入格式】

两个以空格分开的整数。

【输出格式】

一个整数。

【样例输入】

20 30

【样例输出】

50

【题目来源】

洛谷P1001 A+B Problem

一、数据类型是否超限的简单判定方法

本题如果因为数据范围选错了而丢分,不是要把大腿拍麻了?

如果能通过编程让程序输出int型的最大值和最小值,不是永无后顾之忧了!

说干就干,开始实验!

#include<stdio.h>

int main(){

    int i=1000000000;

    printf("%d\n",i);

    return 0;

}

当i的值有9个0时还能正常输出,10个零时就出现了异常,居然输出:1410065408。

将i的值改为负值测试的结果也是一样。

经过这个简单的试验,其实咱们就可以判定,洛谷的那道题用int型是没有问题的。

等等,它只能说明a和b是不超限的,但是a+b呢?可不能忽略了。

当然验证这一点也很简单,只要把代码中i值的最高位由1改为2就可以了,最终确认int仍然满足。

在竞赛中,用这种方式验证比较简单有效。

二、精确输出int型的最大值和最小值

如果想进一步输出int型的最大值和最小值呢?

先介绍一下官方的方法:利用头文件limits.h

在头文件limits.h中,已经定义好了int型的最大值和最小值,即INT_MAX和INT_MIN两个宏,直接拿来用即可。

#include <stdio.h>

#include <limits.h>

int main() {

    printf("%d\n", INT_MAX);

    printf("%d\n", INT_MIN);

    return 0;

}

输出结果:

2147483647

-2147483648

如果不知道这个头文件,或者忘记了这两个宏名呢?那就需要自己动手,费一番工夫了。下面提供一些老金经过尝试发现的方法:

1.与更大的整型对比

思路很简单,int类型数据超限时,long long肯定是未超限的,所以让他们从同一个值开始递增或递减,当二者值不同时,就说明int已超限。

#include<stdio.h>

int main(){

    long long j=0;



    //输出int型最大值

    for(int i=0;;i++){

        if(i!=j) {

            printf("%d\n", i-1);

            break;

        }

        j++;

    }



    //输出int型最小值

    j=0;

    for(int i=0;;i--){

        if(i!=j) {

            printf("%d\n", i+1);

            break;

        }

        j--;

    }

    return 0;

}

上述代码循环次数很大,但实际测试用时8秒多一点。

2. 比较前后值法

思路是比较i和i+1的值,当超限时,它们值的关系肯定会发生变化。

前面已经知道了int型的最大值和最小值分别为2147483647,-2147483648,可以在其附近进行输出测试。

下面给出最大值处的测试代码:

#include<stdio.h>

int main(){

    int i,j=0;

    for(i=2147483643;;i++){

        printf("%d\n",i);

        j++;

        if(j>100) break;

    }

    return 0;

}

测试结果如下图:

细心的朋友可能已经发现,int型的最大值加1正好是最小值,最小值减1正好是最大值,相当于围成了一个圈。

由上图可知,当超过临界值时,数值会发生变号,根据此规律也可以求出int型的最大值和最小值。

代码如下:

#include <stdio.h>

int main() {

    //输出int型最大值

    for (int i = 0;; i++){

        int j = i +1;

        if (j < i) {

            printf("%d\n", i);

            break;

        }

    }



    //输出int型最小值

    for (int i = 0;; i--){

        int j = i-1;

        if (j > i) {

            printf("%d\n", i);

            break;

        }

    }

}

上述代码实际测试用时7秒多一点。

这段代码还有一个比较有意思的现象,也是老金在测试时发现的,就是一定要将i+1(或i-1)先赋给一个变量再与i比较大小,否则像下面这样直接比较将会陷入死循环。

if (i +1 < i)

老金猜想,编译器在编译时直接认为i+1<i是不可能存在的,因此把整个表达式的值置为0。

3. 巧用科学记数法

在尝试的过程中老金发现,如果把科学记数法表示的值赋给变量,当数值超限时会直接输出最大、最小值。

#include<stdio.h>

int main(){

    //输出int型最大值

    int i=1e10;

    printf("%d\n",i);



    //输出int型最小值

    i=-1e10;

    printf("%d\n",i);

    return 0;

}

这里注意要将1e10先赋给一个整型变量,再输出整型变量,而不能直接写成下面这样:

printf("%d\n",1e10);

为什么呢?估计还是编译器的锅。

上面3种非官方输出方法,最可靠的还是第1种,因为如果数值超限肯定不会输出正常值,但具体输出什么值可能不同的编译器会有不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/448514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发系列(二十)·wxml语法·setData()修改对象类型数据、ES6 提供的展开运算符、delete和rest的用法

目录 1. 新增单个、多个属性 1.1 新增单个属性 1.2 新增多个属性 2. 修改单个、多个属性 2.1 修改单个属性 2.2 修改多个属性 3. 优化 3.1 ES6 提供的展开运算符 3.2 Object.assign()将多个对象合并为一个对象 4. 删除单个、多个属性 4.1 删除单个属性 …

leetcode 热题 100_旋转图像

题解一&#xff1a; 翻转数组&#xff1a;先将数组沿右上-左下对角线翻转&#xff0c;再将数组上下翻转。 class Solution {public void rotate(int[][] matrix) {int n matrix.length;for (int i 0; i < n; i) {//沿右上-左下对角线翻转for (int j 0; j < n - i - 1…

Corel会声会影视频编辑软件英文名是Corel VideoStudio2023

Corel会声会影视频编辑软件英文名是Corel VideoStudio2023&#xff0c;可以抓取、编制和导出多种常见的视频格式。介绍整理从早期的会声会影9、会声会影10后到会声会影X系列版本包括X2、X3、X4、X5、X6、X7、X8、X9、X10&#xff0c;2018&#xff0c;2019&#xff0c;2020&…

分布式之Ribbon使用以及原理

Ribbon使用以及原理 1、负载均衡的两种方式 服务器端负载均衡 传统的方式前端发送请求会到我们的的nginx上去&#xff0c;nginx作为反向代理&#xff0c;然后路由给后端的服务器&#xff0c;由于负载均衡算法是nginx提供的&#xff0c;而nginx是部署到服务器端的&#xff0c;所…

动态代理以及Retrofit的原理

代理模式&#xff09; 首先什么是代理模式&#xff1f; 代理模式就是通过引入代理对象去帮助真实对象完成一些事情&#xff0c;防止直接访问目标对象给系统带来不必要的复杂性。 代理模式一般分为三个角色&#xff1a; 抽象角色&#xff1a; 指代理对象和真实对象对外提供的…

YOLOv8_pose-Openvino和ONNXRuntime推理【CPU】

1 环境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 Openvino内部集成了Opencv、Tens…

数据结构--链表和递归

前面我们所学习的线性数据结构 1、动态数组 2、栈 3、队列 它们的底层都是依托于静态的数组所实现&#xff1a;靠resize解决固定容量的问题 一、链表 1、链表&#xff1a;真正的动态数据结构 优点&#xff1a;不需要处理固定容量的问题&#xff0c;是真正的动态数据结构 …

【leetcode C++】最小栈

leetcode 155. 最小栈 题目 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获…

2024.3.11

作业&#xff1a; #include <iostream> #include<iomanip> #include<string> using namespace std;int main() {string str; // array<char,128> a; // array<char,128>::iterator iter;cout << "请输入一个字符串:" <…

位运算#蓝桥杯

位运算#蓝桥杯 文章目录 位运算#蓝桥杯1、小蓝学位运算2、异或森林3、位移4、笨笨的机器人5、博弈论 1、小蓝学位运算 #include<bits/stdc.h> using namespace std; using LL long long; const LL N 1e97; template<int kcz> struct ModInt { #define T (*this)…

HubSpot和NETFARMER是什么关系?

HubSpot和NETFARMER之间的关系是合作伙伴关系&#xff0c;特别是在亚太地区。NETFARMER作为HubSpot的合作伙伴&#xff0c;专注于帮助企业在海外市场获得更多客户&#xff0c;实现业务增长和成功。 NETFARMER具备丰富的经验和专业的营销团队&#xff0c;他们深入了解亚太地区各…

如何在Linux使用Docker部署Firefox并实现无公网IP访问本地浏览器

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

YOLOv7_pose-Openvino和ONNXRuntime推理【CPU】

1 环境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 Openvino内部集成了Opencv、Tens…

STM32串口:DMA空闲中断实现接收不定长数据(基于HAL库)

STM32串口&#xff1a;DMA空闲中断实现接收不定长数据&#xff08;基于HAL库&#xff09;&#xff1a; 第一步&#xff1a;设置rcc&#xff0c;时钟频率&#xff0c;下载方式 设置system core->RCC如图所示&#xff1a;&#xff08;即High Speed Clock和Low Speed Clock都选…

【企业动态】国际知名设备商来访东胜物联,考察交流

本周&#xff0c;国际知名设备商的技术及生产团队一行莅临东胜物联杭州总部和湖州生产工厂&#xff0c;进行参观考察&#xff0c;深入交流。该设备商的业务范围广泛&#xff0c;在全球各地拥有许多分公司&#xff0c;其中机器人和工业自动化设备等多项业务处于业界领先水平。 …

设计模式深度解析:工厂方法模式与抽象工厂模式的深度对比

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;工厂方法模式文章浏览阅读17k次&#xff0c;点赞105次&#xff0…

【棘手问题】Spring JPA一级缓存导致获取不到数据库表中的最新数据,对象地址不发生改变

【棘手问题】Spring JPA一级缓存导致获取不到数据库表中的最新数据&#xff0c;对象地址不发生改变 一、问题背景二、解决步骤2.1 debug2.2 原因分析2.2.1 数据步骤2.2.2 大模型解释2.2.3 解释举例2.2.4 关键函数 2.3 解决方案 三、Spring JPA一级缓存 一、问题背景 项目的数据…

CubeMX使用教程(5)——定时器PWM输出

本篇我们将利用CubeMX产生频率固定、占空比可调的两路PWM信号输出 例如PA6引脚输出100Hz的PWM&#xff1b;PA7引脚输出500Hz的PWM&#xff0c;双路同时输出 我们还是利用上一章定时器中断的工程进行学习&#xff0c;这样比较方便 首先打开CubeMX对PA6、PA7进行GPIO配置 注&a…

Python递归函数你用对了吗?

1.递归函数 递归函数&#xff1a;函数自己调用自己 2.需求 使用函数的方式&#xff0c;计算数字n的阶乘 # 5&#xff01; """ 5! 1 * 2 * 3 * 4 * 5 4! 1 * 2 * 3 * 4 3! 1 * 2 * 3 2! 1 * 2 1! 1综上可以总结出&#xff1a;n! n * (n - 1) "&qu…

Spring Cloud部署篇2——Docker Compose部署至CentOS云服务器

一、项目介绍 系统模块 com.mingink |--mingink-api // 接口模块 | └──mingink-api-system // 系统接口 |--mingink-common // 通用模块 | └──mingink-common-core // 系统接口 |--mingink-gateway…