C++程序异常:寻找末尾两位均为奇数的首个完全平方数出错
问题排查与修正
你的代码存在两个核心错误,还有一个潜在的精度问题需要注意:
1. 十位数字计算逻辑错误
你用i % 100获取倒数第二位数字,这是错误的——i%100得到的是最后两位的整体数值(比如121%100=21),21是奇数,但实际上十位数字是2(偶数),这才是你误判121、225的原因。正确获取十位数字的方式是先除以10(去掉个位),再取模10:
int secondToLastDigit = (i / 10) % 10;
2. 找到目标数后未终止循环
你的循环会遍历1到999的所有数,输出所有符合条件的完全平方数,而非仅第一个。找到目标后,需要用break终止循环(或直接return 0结束程序)。
3. 潜在的sqrt精度隐患
sqrt返回double类型,转换为int时可能存在精度丢失(比如部分大平方数的平方根计算结果会略小于实际整数,转int后少1)。更可靠的方式是直接遍历整数n,计算n*n生成完全平方数,避免平方根计算的误差。
修正后的代码如下:
#include <iostream> using namespace std; int main() { for (int n = 1; ; n++) { int square = n * n; // 获取个位和十位数字 int lastDigit = square % 10; int secondToLastDigit = (square / 10) % 10; if (lastDigit % 2 != 0 && secondToLastDigit % 2 != 0) { cout << "Found it. The first perfect square with two odd ending digits is " << square << endl; break; // 找到第一个符合条件的数后终止循环 } } return 0; }
运行这段代码会输出正确结果:2025(45的平方,末两位25均为奇数)。
内容的提问来源于stack exchange,提问作者Shah
相关产品推荐
相关产品推荐

