C++阶乘程序输出科学计数法而非整数值问题求解(Ubuntu20.04)
问题原因
- 你代码中使用
long double(浮点类型)存储阶乘结果,C++标准库的std::cout默认对超出普通浮点显示范围的数值会自动切换为科学计数法输出。 - 另外
std::cout默认对浮点类型只保留6位有效数字,导致12!的尾数被截断,才会出现和实际整数值479001600不符的显示问题。
解决方法
这里提供两种常用可行方案:
方案1:调整浮点输出格式
如果需要保留long double的存储逻辑,引入<iomanip>头文件,用std::fixed(固定小数格式)和std::setprecision(控制输出精度)修改输出规则即可,修改后代码示例:
#include <iostream> #include <iomanip> // 新增格式控制头文件 int main() { int n; long double factorial = 1.0; std::cout << "Enter a positive integer: "; std::cin >> n; if (n < 0) std::cout << "Error! Factorial of a negative number doesn't exist."; else { for (int i = 1; i <= n; i++) { factorial *= i; } // 调整输出格式:固定小数显示,精度设为0即不展示小数部分 std::cout << "Factorial of " << n << " = " << std::fixed << std::setprecision(0) << factorial; } return 0; }
方案2:改用整型存储阶乘(更推荐)
阶乘结果均为正整数,使用整型存储可以从根本上避免浮点精度损失和格式异常问题,不同整型可支持的最大阶乘如下:
- 32位有符号int:最大支持12!
- 64位有符号long long:最大支持20!
- 需要计算更大阶乘需自行实现大整数运算或引入第三方大整数库
修改为long long存储的代码示例:
#include <iostream> int main() { int n; long long factorial = 1; // 替换为整型存储 std::cout << "Enter a positive integer: "; std::cin >> n; if (n < 0) std::cout << "Error! Factorial of a negative number doesn't exist."; else { for (int i = 1; i <= n; i++) { factorial *= i; } std::cout << "Factorial of " << n << " = " << factorial; } return 0; }
内容的提问来源于stack exchange,提问作者M. Marayef
相关产品推荐
相关产品推荐

