C++使用int存储大数求末位输出总为5或7的问题
问题原因
你代码中使用的int类型在绝大多数主流操作系统中占4字节,有符号int的取值范围为 -2147483648 ~ 2147483647,最多只能存储10位的整数。你输入的数字比如645177858745、8698184618951都远超过这个范围,会触发整数溢出,属于C++标准中的未定义行为。
此时cin读入操作会失败,变量a中存储的已经不是你输入的原始数值,常见实现中会被赋值为int的最大值2147483647(模10结果为7),或者发生二进制截断后得到的数值模10为5,这就是你输出总是7或5的原因。
修复方案
- 方案1:改用范围更大的整数类型
将int替换为long long,8字节的long long取值范围为-9223372036854775808 ~ 9223372036854775807,最多支持18位整数输入,可满足绝大多数常规场景需求,修改后代码如下:
#include <iostream> using namespace std; int main() { long long a; cout << "Enter a number: "; cin >> a; a = a % 10; cout << "Last Number is " << a; return 0; }
- 方案2:用字符串处理超长数字
如果需要处理超过18位的超大数字,直接将输入作为字符串读取,取最后一位字符转换为数字即可,完全规避整数溢出问题:
#include <iostream> #include <string> using namespace std; int main() { string num_str; cout << "Enter a number: "; cin >> num_str; int last_num = num_str.back() - '0'; cout << "Last Number is " << last_num; return 0; }
内容的提问来源于stack exchange,提问作者Danish Shaikh
相关产品推荐
相关产品推荐

