第一个代码
void solve()
{
ll n;
cin >> n;
vector <ll> v(n);
ld sum = 0;
ld mx = 0;
for(int i = 0; i < n; i++)
{
cin >> v[i];
}
while (v.size() > 1) {
sort(v.begin(), v.end());
int i = 0, j = 1;
ld ac = (v[i] + v[j]) / 2;
sum += v[i] + v[j];
v.erase(v.begin() + j);
v.erase(v.begin() + i);
v.push_back(ac);
}
cout << floor(v[0]) << "\n";
}
当我提交第一个代码时,当数字很大时,输出以科学计数法表示。 但是当我删除楼层函数输出时,它是整数吗?为什么? ChatGpt 说在此处输入图像描述 当我移除地板时,代码被接受了:
void solve()
{
ll n;
cin >> n;
vector <ll> v(n);
ld mx = 0;
for(int i = 0; i < n; i++)
{
cin >> v[i];
}
while (v.size() > 1) {
sort(v.begin(), v.end());
int i = 0, j = 1;
ld ac = (v[i] + v[j]) / 2;
v.erase(v.begin() + j);
v.erase(v.begin() + i);
v.push_back(ac);
}
cout <<v[0] << "\n";
}
问题链接在这里:https://codeforces.com/contest/2021/problem/A 我知道这个问题是一个更好、更短的解决方案。我就是这样做的。但我好奇的心想知道我在这里所说的。而且我还知道使用了一些不必要的数据类型。但在这里
ld ac = (v[i] + v[j]) / 2;
以 long long 或 int 计算,因为 v[i] 和 v[j] 是 long long 或 int。 ac 存储在具有 long long 数据类型的向量中。我认为这里没有发生 ChatGpt 所说的浮点运算。
floor 返回
float
或 double
(从链接中的文档中获取的屏幕截图,内容作为代码粘贴在其下方)
float floor ( float num );
double floor ( double num );
long double floor ( long double num );
(until C++23)
constexpr /* floating-point-type */
floor ( /* floating-point-type */ num );
(since C++23)
float floorf( float num );
(2) (since C++11)
(constexpr since C++23)
long double floorl( long double num );
(3) (since C++11)
(constexpr since C++23)
Additional overloads (since C++11)
Defined in header <cmath>
template< class Integer >
double floor ( Integer num );
(A) (constexpr since C++23)
引用退货摘要:
因此,该值在逻辑上是一个整数,但它的类型是如果没有错误,则返回不大于num的最大整数值,即⌊num⌋。
float
或
double
,这是问题的根源,因为,如果您的值碰巧是
int
,那么
floor
会搜索
int
的最大整数下确界,即它本身。因此,除非您同意将输出中的所有整数转换为
float
/
double
,否则不要调用
floor
。或者,如果您实际上有想要向下舍入的
float
和
double
值,那么您可以通过将
floor
的结果转换为 int
cout << ((int)floor(v[0])) << "\n";