-2

下面是我编写的用于查找 6 的指数的程序,但我给出了错误的输出,或者我可能在某个地方出错,我无法在这里弄清楚。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll t;
    cin>>t;
    cout<<log(t)/log(6)<<"\n";
    cout<<floor(log(t)/log(6))<<"\n";
    cout<<ceil(log(t)/log(6));
    return 0;
}

输入:-

216

输出:-

3

3

4

由于216可以写成6*6*6,所以无论是 ceil 还是 floor ,三种情况下的输出都应该是 3。

回答我自己的问题,这个问题可以通过设置小精度(这里最多 2 个十进制数字)来解决,下面是相同的程序。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    cout<<log(t)/log(6)<<"\n";
    cout<<floor((floor(log(t)/log(6)*100.0)/100.0))<<"\n";
    cout<<ceil((floor(log(t)/log(6)*100.0)/100.0));
    return 0;
}
4

2 回答 2

3

log函数 - 像大多数浮点计算一样 - 是不精确的。结果中通常存在少量错误。在您的情况下,您没有得到确切的 3,而是一些略大于 3 的值。当您应用ceilfloor处理这种不精确的结果时,您可能会增加或减少错误的数量,直到一个整数。在这种情况下,您通过将结果从几乎正确的整数上限增加到恰好跟随的整数来增加错误)。

于 2020-10-13T12:09:08.640 回答
0

如果你想找到一个整数关于给定基数的指数,那么重复除法和检查余数是一个很好的起点。如果您想挤出更多性能,可以研究一些更快的方法(与平方指数相关)。

问题是使用两个log调用的比率并将其截断为 anint势必会给您一个不准确的答案,因为 a 的结果log很可能不能完全表示为浮点值,并且log函数本身可能无法恢复最佳浮点点值可能(C++ 标准和 IEEE754 都没有坚持)。

最后,在 上#define ll long long,不要那样做。它只是用来混淆视听。并且#include<bits/stdc++.h>不是可移植的 C++。

于 2020-10-13T12:04:17.513 回答