社区讨论

站外题求助

学术版参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo1alszw
此快照首次捕获于
2023/10/22 17:55
2 年前
此快照最后确认于
2023/11/02 18:13
2 年前
查看原帖

数据溢出 (overflow, 1s/256M)

数据溢出是程序员经常会遇到的 bug 之一。例如,32 位无符号整型的数据范围是 023210∼2^{32}-1而如果一个该类型的变量的取值超过了 23212^{32}-1,那么就会导致数据溢出,使得程序运行出不可预料的结果。
所幸的是,在 GCC 版本的 C++ 编译器中,有这样一个可以帮助检查代码中所有 “未定义行为(Undefined Behaviour)” 的检查器(Sanitizer),而数据溢出就是一类未定义行为。如果编译的时候开启这个检查器,那么一旦程序运行的时候出现了未定义行为,那么程序就会返回一个 Runtime Error 的结果。
在本题中,你的任务就是实现检查器中有关数据溢出的部分。具体来说,假设某种无符号数据类型的数据范围是0M0∼M,然后接下来会给出某段程序其中一个变量的变化情况(该变量初始值为00),你需要判断该变量是否发生了数据溢出。

输入格式

第一行输入一个正整数TT,表示数据组数。
对于每一组数据,第一行输入两个正整数N,MN,M,分别表示变量变化次数和该数据类型的范围。 接下来NN行,每一行的输入都形如如下三种格式之一:
  • ++ x:表示该变量的值加上xx,即设变量的原值为AA,那么新值就是A+xA+x
  • * x:表示该变量的值乘上xx,即设变量的原值为AA,那么新值就是AxA*x
  • / x:表示该变量的值除以xx并向下取整,即设变量的原值为AA,那么新值就是⌊A/xA/x⌋。其中⌊x⌋ 表示向下取整,例如 ⌊3.1⌋=3 ,⌊0.1⌋=0 ,⌊5⌋=5
注意:本题输入量较大,请使用速度较快的输入方式。

输出格式

对于每一组数据,输出一行一个正整数,表示其最早发生数据溢出的操作次数。如果没有发生数据溢出,则输出一行 Not Overflow。

样例输入

CPP
2
5 9999
+ 2
* 10
/ 2
* 1000
/ 1000
5 10000
+ 2
* 10
/ 2
* 1000
/ 1000

样例输出

CPP
4
Not Overflow
样例解释 第一组数据的第四步是给变量乘以 1000,之后得到的变量的值是 10000,超过了 9999,故发生了数据溢出。 数据范围
  • 对于 30% 的数据,1N10,1M2161 \le N \le 10 , 1 \le M \le 2^{16}
  • 对于 60% 的数据,1N1000,1M2321 \le N \le 1000 , 1 \le M\le 2^{32}
  • 对于 100% 的数据,1N105,0M<263,1T5,1x<M1 \le N \le 10^5 , 0\le M < 2^{63} , 1 \le T \le 5,1 \le x <M
数据保证不会除以 0。

回复

1 条回复,欢迎继续交流。

正在加载回复...