【C/C++】整数及乘积的溢出问题

文章目录

  • 一、为什么会溢出?
  • 二、怎样解决?
  • 三、看个例题
  • 四、补充:scanf和cin的区别

一、为什么会溢出?

整数乘积的溢出问题是指两个整数相乘得到的结果超过了所能表示的数据类型的范围。

在计算机中,整数的表示是有限的,即存在一个最大值和最小值。当进行乘法运算时,如果结果超出了整数的表示范围,就会发生溢出。这种情况下,计算结果将不再准确,并且可能导致数据丢失或错误的计算结果。

比如:int类型,C 语言标准规定了 int 类型必须至少能表示 -32767 到 32767 之间的整数,也就是说,int 类型的最小值和最大值范围为 -215 到 215-1。

一般而言,int 类型在 32 位操作系统上占用 4 个字节(32 位),在 64 位操作系统上占用 8 个字节(64 位)。使用 limits.h 头文件可以查看当前编译器中 int 类型的最大值和最小值。

#include<iostream>
#include <limits.h>
using namespace std;int main()
{printf("INT_MIN: %d\n", INT_MIN);printf("INT_MAX: %d\n", INT_MAX);system("pause");return 0;
} 

在这里插入图片描述
至于INT_MIN的值为什么是-2147483648,原因是:

在 32 位系统中,int 类型通常占据 4 个字节,即 32 位,而最小的带符号整数(-2^31)的二进制补码表示恰好对应于 -2147483648。

二、怎样解决?

可以使用更大范围的整数类型,比如 long long 或者 int64_t 等,以支持更大范围的数值计算。

根据取值范围,灵活选用整数类型:
整型数据类型及其取值范围详解

三、看个例题

求 a 的 b 次方对 p 取模的值,其中 0≤a,b,c≤109, c>0

  • 用c++写:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c;int main(){cin >> a >> b >> c;ll ans = 1;while (b) {if(b&1) {ans = ans * a % c;} a = a * a % c;b /= 2;  // 将指数右移一位}cout << ans % c << endl;return 0;
}

这里用long long类型来表示a,b,c三个数,防止整数溢出,同时用到了快速幂算法,防止两整数相乘的结果发生整数溢出。

快速幂算法通过对指数 y 进行二进制拆分,将指数的幂运算转化为多个底数的平方运算,从而减少了计算次数,提高了算法效率。

  • 在 C 和 C++ 中,y & 1 表示对变量 y 的值和二进制数 1 进行按位与(AND)操作。具体来说,这个表达式会将 y 的二进制表示的最低位与 1 进行按位与运算,得到的结果为 0 或 1。

  • 如果 y 的最低位是 1,那么 y & 1 的结果就是 1;如果 y 的最低位是 0,那么 y & 1 的结果就是 0。

  • 这种操作通常用于判断一个整数是奇数还是偶数。因为二进制数的最低位为 1 表示奇数,为 0 表示偶数,所以 y & 1 可以快速判断 y 是奇数还是偶数。

  • c的写法: (和c++只有一点点区别,文末补充)
#include<stdio.h>
int main(){long long a,b,c,d=1;scanf("%ld %ld %ld",&a,&b,&c);while(b){if(b&1)	d=d*a%c;a=a*a%c;b>>=1;}printf("%ld",d%c);
}
  • python的写法
a, b, c = map(int, input().split())
print(pow(a, b, c))

但是如果python以下写法,数值很大的时候就会发生溢出。

a, b, c = map(int, input().split())
ans = pow(a, b) % c
print(ans)

虽然Python 中的整数类型是动态的,不会存在固定的最大值,但如果结果超出了 Python 能表示的范围,也会发生溢出。就比如pow(a, b) % c这一步,当a, b, c 很大的时候,也是会发生整数溢出。

但是python有个很方便的函数,就是pow()的用法

pow(a, b, c)

具体参数含义如下:
a:底数
b:指数
c:模数

这个函数返回值为 (a**b) % c 的结果。

例如,pow(2, 3, 5) 将返回 3,因为 2 的 3 次方是 8,然后对 5 取模的结果是 3。

pow(a, b, c)函数在需要进行大数运算并对结果取模的情况下非常有用。

四、补充:scanf和cin的区别

scanf() 是 C 语言中的输入函数,而 cin 是 C++ 中的输入流对象。它们之间有以下几个区别:

  1. 语言:scanf() 是 C 语言的函数,而 cin 是 C++ 的输入流对象。

  2. 输入方式:scanf() 是使用格式化字符串来指定输入格式,可以通过不同的格式说明符(如 %d%f%s 等)来读取不同类型的数据。而 cin 使用运算符重载和类型推断来直接从标准输入流中读取数据,不需要显式指定输入格式。

  3. 错误处理:scanf() 在读取输入时需要注意错误处理,因为它不能自动处理输入格式不匹配或类型不正确的情况。而 cin 可以检测到输入类型不匹配等错误,并提供相应的错误处理机制,比如将输入流置于错误状态,清除错误标志等。

  4. 输入缓冲:scanf() 函数对输入的处理是基于缓冲区的,它会将输入数据读取到缓冲区中,然后根据格式字符串进行解析。而 cin 对象则是基于流的输入,它会逐个字符地从输入流中读取并解析数据,不需要缓冲区。

  5. 输入分隔符:scanf() 默认以空格、制表符、换行符等作为输入分隔符,可以通过格式化字符串来指定不同的分隔符。而 cin 默认以空格、制表符、换行符等作为输入分隔符,但它还提供了更灵活的方式来处理不同的输入分隔符。

总的来说,scanf() 是 C 语言中的函数,使用格式化字符串来指定输入格式,而 cin 是 C++ 中的输入流对象,使用运算符重载和类型推断来直接从标准输入流中读取数据,并提供更灵活的错误处理机制。两者在输入方式、错误处理、缓冲处理和输入分隔符上有所不同。

ps:如若文章有误,感谢指正!(づ ̄3 ̄)づ╭❤~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动应用开发Android 创建第一个Android项目

文章目录 一、创建第一个Android项目1.1 准备好Android Studio1.2 运行程序1.3 程序结构是什么app下的结构res - 子目录&#xff08;所有图片、布局、字AndroidManifest.xml 有四大组件&#xff0c;程序添加权限声明 Project下的结构 二、开发android时&#xff0c;部分库下载异…

Spinnaker多云持续交付平台: 部署Minio存储服务

目录 一、实验 1.环境 2.K8S storage节点部署NFS 3.K8S 动态创建PV 4.K8S master节点部署HELM3 4.K8S master节点部署Minio存储服务&#xff08;第一种方式安装&#xff09; 5.Minio客户端安装MC命令 6.K8S master节点使用Docker 部署Minio存储服务&#xff08;第二种方…

FPS游戏框架漫谈第二十天

今天我们聊的话题是&#xff1a; 《吃鸡中武器护甲逻辑》 当我们接到一个需求就是给我们游戏中的特定的模式指定的武器支持加护甲的功能 那么这个流程是什么样的呢&#xff1f; 第一步一般这个新增护甲的配置属性肯定是加载武器的Config json文件里面的呢&#xff0c;并且是支持…

Ubuntu 1804 And Above Coredump Settings

查看 coredump 是否开启 # 查询&#xff0c; 0 未开启&#xff0c; unlimited 开启 xiaoUbuntu:/var/core$ ulimit -c 0# 开启 xiaoUbuntu:/var/core$ ulimit -c unlimited查看 coredump 保存路径 默认情况下&#xff0c;Ubuntu 使用 apport 服务处理 coredump 文件&#xff…

华为配置车地通信快速切换实验

配置车地通信快速切换示例 组网图形 图1 配置车地通信快速切换业务示意图 组网需求配置思路配置注意事项操作步骤配置文件 组网需求 某轨交企业为了降低网络部署成本&#xff0c;提升服务质量&#xff0c;希望通过WLAN技术实现车地通信&#xff0c;使部署在地面网络的组播服务器…

【前端】实现Vue组件页面跳转的多种方式

目录 前言1. 内嵌2. 跳转新页面2.1 Demo12.2 Demo22.3 Demo3 3. 拓展 前言 通过某个Button让页面多种方式跳转 1. 内嵌 想要在Vue应用中内嵌一个外部网页&#xff0c;可以使用<iframe>标签 下面是一个示例&#xff1a; <template><div><!-- 在这里嵌入…

阿里云游戏服务器租用价格表,2024最新报价

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

ASP.NET Core 7 MVC 使用 Ajax 和控制器通信

ASP.NET Core MVC中&#xff0c;如果前端使用ajax访问后端&#xff0c;后端的代码可以直接使用控制器&#xff0c;控制器返回值建议JSON格式&#xff0c;利用POST参数做一些验证传值 前端代码&#xff1a; $.ajax({url: "Test",type: "POST",data: {"…

【C++修行之道】(引用、函数提高)

目录 一、引用 1.1引用的基本使用 1.2 引用注意事项 1.3 引用做函数参数 1.4 引用做函数返回值 1.5 引用的本质 1.6 常量引用 1.7引用和指针的区别 二、函数提高 2.1 函数默认参数 2.2函数占位参数 2.3 函数重载 2.4函数重载注意事项 一、引用 1.1引用的基本使用 …

【RT-DETR进阶实战】利用RT-DETR进行视频划定区域目标统计计数

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 Hello,各位读者,最近会给大家发一些进阶实战的讲解,如何利用RT-DETR现有的一些功能进行一些实战, 让我们不仅会改进RT-DETR,也能够利用RT-DETR去做一些简单的小工作,后面我也会将这些功能利用PyQt或者是…

备战蓝桥杯---搜索(完结篇)

再看一道不完全是搜索的题&#xff1a; 解法1&#xff1a;贪心并查集&#xff1a; 把冲突事件从大到小排&#xff0c;判断是否两个在同一集合&#xff0c;在的话就返回&#xff0c;不在的话就合并。 下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace …

LeetCode-第28题-找出字符串中第一个匹配项的下标

1.题目描述 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 2.样例描述 3.思路描述 可以让字符串 …

Apache Flink

前言 最近在学习室内融合定位服务架构&#xff0c;业务架构上&#xff0c;涵盖了数据采集、处理、状态管理、实时计算和告警等多个方面&#xff0c;但有些问题&#xff1a;这套系统中包含了大量的有状态计算&#xff0c;目前是通过自设计内存对象进行管理&#xff0c;并利用Re…

迎新年年终总结

迎新年年终总结 1、除夕迎新年登高有感 1、除夕迎新年登高有感 除旧岁&#xff0c;迎新年。凭栏立&#xff0c;意阑珊。 天空阔&#xff0c;世道艰。唯自强&#xff0c;可彼岸。 于2024年2月9日 10:51。

【前端web入门第四天】01 复合选择器与伪类选择器

文章目录: 1. 复合选择器 1.1 后代选择器 1.2 子代选择器 1.3 并集选择器1.4 交集选择器(了解) 2.伪类选择器 2.1 伪类-文本2.2 伪类-超链接&#xff08;拓展) 1. 复合选择器 什么叫复合选择器? 由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 复合选择器的作…

158基于matlab的用于分析弧齿锥齿轮啮合轨迹的程序

基于matlab的用于分析弧齿锥齿轮啮合轨迹的程序&#xff0c;输出齿轮啮合轨迹及传递误差。程序已调通&#xff0c;可直接运行。 158 matlab 弧齿锥齿轮啮合轨迹 传递误差 (xiaohongshu.com)

RedissonClient妙用-分布式布隆过滤器

目录 布隆过滤器介绍 布隆过滤器的落地应用场景 高并发处理 多个过滤器平滑切换 分析总结 布隆过滤器介绍 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是…

openssl3.2 - exp - RAND_bytes_ex

文章目录 openssl3.2 - exp - RAND_bytes_ex概述笔记END openssl3.2 - exp - RAND_bytes_ex 概述 生成随机数时, 要检查返回值是否成功, 不能认为一定是成功的(官方文档上有说明). 生成随机数的API, 和库上下文有关系, 使用RAND_bytes_ex()比RAND_bytes()好些. 笔记 /*! * …

SolidWorks的抽壳

抽壳在建模的时候是比较常见的要求&#xff0c;这里废话不多说&#xff0c;直接开始实例操作。 文章目录 一、规则实体抽壳2、多面抽壳3、空心化抽壳 二、椎体抽壳三、不规则实体抽壳1、不规则实体2、部分实体抽壳 文章随时可能更新&#xff0c;请关注文章原出处&#xff1a; …

LeetCode:210课程表Ⅱ(图论:拓扑排序判断是否有环)

做本题之前最好先做了LeetCode&#xff1a;207课程表&#xff0c;见本人另一篇博客http://t.csdnimg.cn/vSXgN 题目 现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &am…