You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:31:17