打印科学格式符号

问题描述 投票:0回答:1

第一个代码

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 所说的浮点运算。

c++ c++17
1个回答
0
投票

floor 返回

float
double
(从链接中的文档中获取的屏幕截图,内容作为代码粘贴在其下方)

Screenshot taken from the documentation

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";
    
© www.soinside.com 2019 - 2024. All rights reserved.