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

求数组中最大非完全平方数的C++程序报错,请求问题排查

问题:找出数组中最大的非完全平方数的C++程序无法正常运行

我尝试编写一个C++程序,用于找出数组中的最大非完全平方数并打印它。完全平方数即满足x = y²(例如4=2²)。以下是我尝试的代码,但无法正常运行,不清楚问题所在:

#include <iostream>
#include <cmath>
using namespace std;
int main() {
    int n;
    cin >> n;
    int arr[n];
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
        sqrt(arr[i]);
        if ((arr[i] * 10) % 10 == 0)
            arr[i] = arr[1];
        else
            arr[i] = arr[0];
    }
    for (int i = 0; i < n; i++) {
        if (arr[0] < arr[i])
            arr[0] = arr[i];
    }
    cout << arr[0] << endl;
    return 0;
}

我的逻辑是:对每个数组元素取平方根,判断其是否为非完全平方数。通过将元素乘以10后取10的模,来判断平方根是整数还是小数(例如:2*10=20,20%10=0则为完全平方数,否则不是)。之后我将每个非完全平方数存入arr[0],在后续循环中找出最大的非完全平方数并打印。请问我哪里出错了?

注:arr[变量]的写法是有效的,因为在CodeBlocks中可以运行。感谢!


看起来你的代码里有几个关键的逻辑错误,导致程序无法正确找出最大的非完全平方数。我们一步步来拆解问题,然后给出修正后的方案:

你的代码中的核心错误

1. 完全平方数的判断逻辑完全错误

你尝试用(arr[i] * 10) % 10 == 0来判断平方根是否为整数,这完全不成立:

  • 这个条件实际上只是检查原数的最后一位是否为0(任何数乘10后模10结果都是0),和是否是完全平方数没有关系。比如2是非完全平方数,但2*10%10结果是0;9是完全平方数,9*10%10结果也是0。
  • 更关键的是,你调用了sqrt(arr[i])但没有把结果保存下来,这一步操作完全没有起到任何作用。

2. 数组元素的修改逻辑错误

在第一个循环里,你不管判断结果如何,都把arr[i]赋值为arr[1]或者arr[0],这直接破坏了原数组的所有数据。后面的最大值查找循环只能处理这些被错误覆盖后的数值,自然得不到正确结果。

3. 非标准的变长数组(VLA)

虽然CodeBlocks的GCC编译器支持int arr[n];这种变长数组写法,但这并不是标准C的语法。标准C中,数组的大小必须是编译期常量,建议改用std::vector来存储动态输入的数组。

修正后的实现思路

正确的做法应该是:

  • 遍历数组中的每个元素,判断它是否为非完全平方数
  • 在遍历过程中,记录当前找到的最大非完全平方数(或者先收集所有非完全平方数,再从中找最大值)
  • 正确的完全平方数判断方法:计算元素的平方根,取整后平方,看是否等于原数(注意处理浮点数精度问题)

修正后的代码

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

// 判断一个数是否为完全平方数
bool isPerfectSquare(int num) {
    if (num < 0) return false; // 负数不可能是完全平方数
    double sqrtNum = sqrt(num);
    int intSqrt = static_cast<int>(sqrtNum);
    // 处理浮点数精度问题:比如很大的数,sqrt返回的可能是接近整数但略小的情况
    return (intSqrt * intSqrt == num) || ((intSqrt + 1) * (intSqrt + 1) == num);
}

int main() {
    int n;
    cin >> n;
    vector<int> arr(n); // 用vector代替非标准的变长数组
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    int maxNonSquare = -1; // 初始化最大非完全平方数,假设数组元素都是非负的
    bool foundNonSquare = false; // 标记是否找到非完全平方数

    for (int num : arr) {
        if (!isPerfectSquare(num)) {
            foundNonSquare = true;
            if (num > maxNonSquare) {
                maxNonSquare = num;
            }
        }
    }

    if (foundNonSquare) {
        cout << "最大的非完全平方数是:" << maxNonSquare << endl;
    } else {
        cout << "数组中没有非完全平方数" << endl;
    }

    return 0;
}

代码说明

  1. 完全平方数判断函数:isPerfectSquare函数先处理负数(负数不可能是完全平方数),然后计算平方根并取整,通过比较整数平方和原数是否相等来判断,同时考虑了浮点数的精度误差(比如某些大数的sqrt结果可能略小于实际整数)。
  2. 遍历找最大值:遍历数组时,只要遇到非完全平方数,就和当前记录的最大值比较更新。
  3. 边界处理:增加了foundNonSquare标记,防止数组全是完全平方数时输出错误的初始值。
  4. 标准容器:用std::vector代替了非标准的变长数组,保证代码的可移植性。

内容的提问来源于stack exchange,提问作者Adam Hussein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:42:48