当前位置: 首页 > news >正文

UVa 465 Overflow

题目描述

题目要求判断表达式中的两个非负整数以及运算结果是否超出323232位有符号整数的表示范围(即[−231,231−1][-2^{31}, 2^{31}-1][231,2311],但题目中整数为非负,因此范围为[0,231−1][0, 2^{31}-1][0,2311])。表达式格式为整数 运算符 整数,运算符为+*。对于每个表达式,输出原始输入行,然后根据情况输出first number too bigsecond number too bigresult too big中的若干行。

输入格式

输入包含多行,每行一个表达式,格式如300 + 399999999999999999999 + 11。整数可能非常大(超过646464位范围)。输入以文件结束符(EOF\texttt{EOF}EOF)终止。

输出格式

对于每个表达式,先输出原始输入行,然后输出相应的错误信息(最多三行)。信息按顺序输出:先判断第一个数,再判断第二个数,最后判断结果。

样例

输入

300 + 3 99999999999999999999 + 11

输出

300 + 3 99999999999999999999 + 11 first number too big result too big

题目分析

本题的核心是判断大整数是否超出231−1=21474836472^{31}-1 = 21474836472311=2147483647的范围。

判断数字是否太大

由于输入整数可能非常大(超过646464位),不能直接转换为内置整数类型。可以通过字符串长度和前缀判断:

  • 若字符串长度>10> 10>10,则一定超过214748364721474836472147483647(因为214748364721474836472147483647101010位数)。
  • 若长度为101010,则比较字符串与"2147483647"的字典序(因为数字无前导零,可直接比较字符串)。
  • 若长度≤9\le 99,则转换为整数后与214748364721474836472147483647比较。

注意:输入数字可能有前导零,需要先去除。

加法结果判断

两个正整数相加的结果可能超出323232位范围。由于数字可能很大,不能直接计算,可以通过字符串模拟加法或利用长度判断:

  • 若两个数的长度都≤10\le 1010,可转换为整数直接计算后比较。
  • 否则,结果长度至少为max⁡(len1,len2)\max(len1, len2)max(len1,len2)max⁡(len1,len2)+1\max(len1, len2)+1max(len1,len2)+1。若结果长度>10> 10>10,则一定太大;若长度为101010,需比较具体值。

乘法结果判断

两个正整数相乘的结果可能非常大。可以这样判断:

  • 若任一数为000,结果为000,不会太大。
  • 若两个数的长度之和≥12\ge 1212,则乘积至少为101110^{11}1011,远超2312^{31}231,可直接判定为太大。
  • 否则,转换为整数后计算乘积并与214748364721474836472147483647比较。

实现方法

参考代码中使用了字符串模拟加法和减法(虽然本题只有加法,但代码也处理了减法),并提供了is_too_big函数判断字符串是否超出最大值。

复杂度分析

每个表达式处理O(L)O(L)O(L)时间,LLL为数字字符串长度,可接受。

代码实现

// Overflow// UVa ID: 465// Verdict: Accepted// Submission Date: 2016-07-16// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;boolis_too_big(string number,longlongmax_value){if(number.length()>10||(number.length()==10&&number.front()>'2'))returntrue;else{longlongnumber_value=stoll(number);if(number_value>max_value)returntrue;}returnfalse;}intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);string line,first,middle,second;while(getline(cin,line)){istringstreamiss(line);iss>>first>>middle>>second;assert(middle=="*"||middle=="+"||middle=="-");cout<<line<<'\n';intmaxLength=max(first.length(),second.length());while(first.front()=='0'&&first.length()>1)first.erase(first.begin());while(second.front()=='0'&&second.length()>1)second.erase(second.begin());if(is_too_big(first,numeric_limits<int>::max()))cout<<"first number too big\n";if(is_too_big(second,numeric_limits<int>::max()))cout<<"second number too big\n";// beware of that one of numbers is zeroif(middle=="*"){if(first=="0"||second=="0")continue;if(first.length()+second.length()>=12){cout<<"result too big\n";}else{longlongfirst_value=stoll(first),second_value=stoll(second);longlongresult_value=first_value*second_value;if(result_value>numeric_limits<int>::max())cout<<"result too big\n";}continue;}intsign=1;stringresult(maxLength+1,'0');while(first.length()<result.length())first.insert(first.begin(),'0');while(second.length()<result.length())second.insert(second.begin(),'0');reverse(first.begin(),first.end());reverse(second.begin(),second.end());if(middle=="+"){intsum=0,carry=0;for(inti=0;i<result.length();i++){sum=first[i]-'0'+second[i]-'0'+carry;result[i]=sum%10+'0';carry=sum/10;}}else{for(inti=first.length()-1;i>=0;i--)if(second[i]>first[i]){sign=-1;swap(first,second);break;}intsum=0,borrow=0;for(inti=0;i<result.length();i++){sum=first[i]-'0'-second[i]-'0'-borrow;if(sum<0){sum+=10;borrow=1;}else{borrow=0;}result[i]=sum+'0';}}reverse(result.begin(),result.end());while(result.front()=='0'&&result.length()>1)result.erase(result.begin());if(sign>0){if(is_too_big(result,numeric_limits<int>::max()))cout<<"result too big\n";}else{if(is_too_big(result,(longlong)numeric_limits<int>::max()+1))cout<<"result too big\n";}}return0;}
http://www.jsqmd.com/news/1002652/

相关文章:

  • 部署了不会用?来学Claude Code 的 10 个“邪修”秘籍
  • 别再凭感觉调MySQL内存了!手把手教你用SQL监控innodb_buffer_pool命中率
  • 用FreeRTOS和裸机代码两种方式理解STM32平衡小车PID控制逻辑
  • SteamShutdown终极指南:告别熬夜等待,让电脑自动关机的智能解决方案
  • 保姆级教程:在Yolov5/v7/v8中手把手集成CARAFE上采样算子(附完整代码与配置文件)
  • 2026年钦州旅游攻略公司怎么选?本地老牌餐厅与海鲜路线深度评测 - 优质品牌商家
  • 别再只用Web界面了!Proxmox VE 8.x 命令行高手必备的 qm 命令实战手册
  • 保姆级教程:在ROS Noetic下,为你的URDF机器人模型添加一个可用的深度摄像头(Gazebo仿真)
  • 鸿蒙原生应用实战(五):路由导航与工程优化 — 从开发到上线的完整流程
  • 上海ECO棉床垫怎么挑?去了5家店说点大实话 - 深圳市民HLL
  • 2026年高杆桂花苗木基地评价解析:从品种到工程应用的多维观察 - 优质品牌商家
  • 自适应系统中的运行时伦理挑战与解决方案
  • 基于ARM Cortex-M0+的WPR1516无线充电接收芯片:15W Qi标准方案解析与开发实战
  • 2026年近期,选择诚信的平板除雾器品牌为何成为企业的关键决策? - 品牌鉴赏官2026
  • 电赛备赛笔记:用STM32驱动AD9959信号发生器模块,从接线到出波保姆级教程
  • 从‘为什么拒贷我’到‘AI医生怎么看片’:可解释性AI(XAI)如何重塑我们与算法的信任关系
  • shell作业
  • Flutter Hero 动画与共享元素转场:从原理到跨页面动效的工程实践
  • PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等数据库
  • 新手避坑指南:RK3566开发板IO电源域配置,从原理图到DTS修改全流程
  • Win11 专属部署教程,OpenClaw 智能体稳定运行方案【包含安装包】
  • Plain Craft Launcher 2:快速上手指南与完整功能解析
  • CSDN|美团点评推广到底选极速还是标准?
  • 保姆级教程:从零集成华为ScanKit到你的Android项目(含权限、依赖、回调全流程)
  • S32K3 MCAL实战:手把手教你用EB tresos Studio配置160MHz系统时钟(从晶振到PLL)
  • 2026年泰州全屋定制工厂口碑观察:谁在坚守品质与交付? - 优质品牌商家
  • 从箱线图升级到小提琴图?先搞懂KDE这个‘坑’:数据分布可视化中的平滑与失真
  • 那一刻,智能锡膏管理改变了工厂的命运
  • 新人和数采GEO工具测评:AI赋能本地商家引流,值得中小企业
  • 2026年当前嘉兴优秀的门墙柜一体化定制平台综合解析与推荐 - 品牌鉴赏官2026