我试图创建一个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。谢谢!
答案 0 :(得分:1)
您丢失了sqrt
的结果。 sqrt(arr[i])
不会更改arr[i])
。
您不正确地检查平方根是否为整数。您应该将sqrt
的结果转换为int,将其自身相乘并与arr[i]
进行比较。
我让您自由更新您的代码。
答案 1 :(得分:1)
#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=4
。 arr[i]!=j
。如果arr[i]=5
,j=5
,arr[i]=j
和arr[i]
设置为0
。
答案 2 :(得分:1)
您可以使用this逻辑来查找数字是否为完全正方形,这是找到array
正数的最大非完美平方的一种方法,初始化{{1}在进入循环之前,answer=-1
是数组的大小
n