C++浮点数异常问题求助:提取数字代码报错,求修正
修正提取数字各位的C++代码并解决浮点数异常问题
嘿,我来帮你排查代码里的问题,顺便修正它~
首先,你的代码出现Floating Point Exception的核心原因是:循环没有合理的终止条件,导致变量p不断被乘以10,最终超出了int类型的取值范围发生溢出。当p溢出后可能变成0(或者无效的负数),这时候执行110 % p就会触发模0的未定义行为,很多系统会抛出浮点数异常来提示这个错误。
另外,你的代码逻辑还有个小问题:当前用110 % p得到的不是单独的各位数字,而是包含低位的组合值(比如p=100时,110%100=10,这是十位+个位的结果,不是单独的十位数字)。
修正方案1:顺着你的思路调整(保留p的乘法逻辑)
我们给循环加一个合理的终止条件,并且正确计算每一位数字:
#include <iostream> using namespace std; int main() { int num = 110; // 把目标数字单独存起来,方便复用 int p = 10; // 先提取个位 cout << num % p << endl; // 循环提取更高位,直到p的10倍超过num为止 while (p <= num / 10) { // 计算当前位的数字:先取到当前位及低位的余数,再除以p得到单独的一位 int digit = (num % (p * 10)) / p; cout << digit << endl; p *= 10; } return 0; }
这段代码会依次输出0(个位)、1(十位)、1(百位),完美提取各位数字。
修正方案2:更简洁的常见写法
如果不想用p的乘法逻辑,还有一种更直观的方式:每次提取当前数字的个位,然后把数字除以10去掉个位,直到数字变为0:
#include <iostream> using namespace std; int main() { int num = 110; while (num > 0) { cout << num % 10 << endl; // 输出当前个位 num = num / 10; // 去掉已输出的个位 } return 0; }
这段代码同样会输出0、1、1,逻辑更简洁易懂,也不会出现溢出问题。
内容的提问来源于stack exchange,提问作者Math
相关产品推荐
相关产品推荐

