1

我发现了两种从任何基数转换为基数 10 的方法。第一个是我们在大学里做的正常的,比如 521(base-15) ---> (5*15^2)+(2*15^1)+(1*15^0)=1125+30+ 1 = 1156 (base-10) 。我的问题是我将这两种方法都应用于一个数字 (1023456789ABCDE(Base-15)) 但我得到了不同的结果。google code jam 仅接受从第二种方法生成的值,仅针对此特定数字(即 1023456789ABCDE(Base-15))。对于所有其他情况,两者都会产生相同的结果。这个特殊号码有什么大不了的??任何人都可以建议...

#include <iostream>
#include <math.h>
using namespace std;

int main()
{   //number in base 15 is 1023456789ABCDE
    int value[15]={1,0,2,3,4,5,6,7,8,9,10,11,12,13,14};
    int base =15;
    unsigned long long sum=0;
    for (int i=0;i<15;i++)
    {
        sum+=(pow(base,i)*value[14-i]);
    }
    cout << sum << endl; 
    //this prints 29480883458974408
    sum=0;
    for (int i=0;i<15;i++)
    {
        sum=(sum*base)+value[i];
    }
    cout << sum << endl;
    //this prints 29480883458974409
    return 0;
}
4

3 回答 3

2

考虑使用std::stol( ref ) 将字符串转换为长字符串。它可以让你选择要使用的基数,这里是一个带有 base 的数字示例15

int main()
{
    std::string s = "1023456789ABCDE";
    long n = std::stol(s,0,15);
    std::cout<< s<<" in base 15: "<<n<<std::endl;
    // -> 1023456789ABCDE in base 15: 29480883458974409
}
于 2014-08-20T16:24:39.687 回答
1

pow(base, i)使用浮点数,因此您在某些数字上失去了一些精度。

于 2014-08-20T16:15:42.353 回答
1

超出double精度。

的精度double,即 的返回值pow(),至少对于DBL_DIG有效的十进制数字是精确的。 DBL_DIG至少为10,通常为 15 IEEE 754 双精度二进制

所需的数字29480883458974409是 17 位,因此应该会出现一些计算错误。

特别sum += pow(base,i)*value[14-i]是,作为 a 完成long long = long long + (double * long long),结果为long long = double。最接近double2948088345897440929480883458974408。因此pow(),导致问题的不是不精确的值,而是加法的不精确总和。

@Mooing Duck 在评论中引用代码以避免使用pow()及其double限制。以下是一个轻微的变体。

unsigned long long ullongpow(unsigned value, unsigned exp) {
  unsigned long long result = !!value;
  while (exp-- > 0) {
    result *= value;
  }
  return result;
}
于 2014-08-20T19:22:03.863 回答