【问题标题】:Print the maximum non perfect square打印最大非完美正方形
【发布时间】:2018-01-21 03:48:16
【问题描述】:

我正在尝试制作一个 c++ 程序,它可以在数组中找到最大的非完美正方形并打印它,完美正方形,即x = y^2 => 4 = 2^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] 中,在下一个循环中,我应该找到最大的非完美正方形并打印它。我做错了什么?

PS:
考虑arr[variable] 是有效的,因为它适用于 CodeBlocks。谢谢!

【问题讨论】:

  • 这里需要更多信息:sqrt(arr[i]);。看起来你正在抛弃结果。
  • 你可以做arr[i]=sqrt(arr[i])
  • 不过,我好像不明白。您正在打印数组中最大的非完美正方形,对吧?
  • @XcoderX 是的,我正在打印最大的非完美正方形。

标签: c++ arrays


【解决方案1】:

您丢失了sqrt 的结果。 sqrt(arr[i]) 不会改变 arr[i])

您不正确地检查平方根是否为整数。您应该将 sqrt 的结果转换为 int,将其乘以自身并与 arr[i] 进行比较。

我让您可以自行正确更新代码。

【讨论】:

    【解决方案2】:

    您可以使用this 逻辑来查找数字是否为完全平方,这是找到正数的array 的最大非完全平方的一种方法,在进入循环之前初始化answer=-1 , n 是数组的大小

    double answer = -1,temp;
    for(int i=0;i<n;i++){                                       
        if((temp = array[i]) != (sqrt(array[i])*sqrt(array[i]))){
            if(temp > answer){
                answer = temp;
            }
        }
    }
    

    【讨论】:

    • 可能会在这里need some epsilon (temp = array[i]) != (sqrt(array[i])*sqrt(array[i])),因为由于不精确,双打等于不确定。旁注:2 sqrts 相当昂贵。可能值得sqrting 一次并缓存结果。
    • 解决方案不当。
    【解决方案3】:
    #include <iostream>
    #include <cmath>
    using namespace std;
    int main () {
      int n;
      cin>>n;
      int k[n];
      double arr[n];
      for (int i = 0 ; i < n ; i++){
        cin>>k[i];
        arr[i]=sqrt(k[i]);
        int j = arr[i];
        if (arr[i]==j){
          arr[i]=0;
          }
        }
      double m=0;
      int index = 0;
      for (int i = 0; i < n; i++){
        if (arr[i]>m){
          m=arr[i];
          index = i;
        }
      }
      cout << k[index];
    }
    

    这是一个代码。我们引入了double,这样它就可以存储小数。然后我们引入一个整数。如果数字的平方根是小数,则它不是完美的平方。但是,当我引入这个整数j 时,它会将arr[i] 转换为整数。如果数字是完全平方,则arr[i] 是整数,j==arr[i]。我们不想这样,所以我们把它等于0。我们找到最大的数组,并标记索引。然后我们用该索引打印出原始数组中的原始数字。我已将其添加为 float 不存储每个小数点。

    澄清一下:假设arr[i]=4.55556。然后j=4arr[i]!=j。如果arr[i]=5j=5arr[i]=j,然后将arr[i]设置为0

    【讨论】:

    • 可以说 arr[i] 是 4.55556。那么 j 是 4。arr[i]!=j。如果 arr[i] 是 5,j 是 5,arr[i]=j。请在这里逻辑思考。
    • 在后面我介绍了 m,它是平方根值的最大值。我把它平方得到k。
    • 显然是这样。我尝试了 1,2,4,5,它给出了 5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2022-08-23
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多