CS50信用卡问题:int转long后数字隔位求和结果异常求助
问题分析与解决:CS50信用卡隔位求和异常
核心问题
你遇到的异常是因为**sum变量未进行初始化**。在C++中,局部变量如果不显式赋值,会保留内存中的随机垃圾值:
- 使用
int类型时,栈中sum的初始值碰巧是0,所以累加后结果正确; - 改为
long类型时,sum的初始垃圾值极大,最终累加结果就出现了异常的大数值。
修正方法
只需要显式将sum初始化为0即可,修改后的代码如下:
#include <iostream> using namespace std; int main() { long num = 123456789; long sum = 0, last, second; // 显式初始化sum为0 while (num>0) { last = num/10; second = last%10; num /=10; cout<<second<<endl; sum += second; num /=10; } cout<<"sum: "<<sum<<endl; return 0; }
修正后输出
8 6 4 2 0 sum: 20
额外优化建议(可选)
原代码的取数逻辑可以更简洁,直接通过标记控制是否累加数字,避免多余变量:
#include <iostream> using namespace std; int main() { long num = 123456789; long sum = 0; bool skip = true; // 从最后一位开始,先跳过第一位 while (num > 0) { int digit = num % 10; num /= 10; if (!skip) { sum += digit; } skip = !skip; } cout << "sum: " << sum << endl; return 0; }
这段代码逻辑更清晰,同样能得到正确结果20。
内容的提问来源于stack exchange,提问作者Overpaint
相关产品推荐
相关产品推荐

