从任何基数到基数10 c ++的转换

时间:2014-08-20 16:06:07

标签: c++ base-conversion

我发现了从任何基地到基地10的两种转换方式。第一个是我们在521(base-15)--->等大学里做的正常的。 (5 * 15 ^ 2)+(2 * 15 ^ 1)+(1 * 15 ^ 0)= 1125 + 30 + 1 = 1156(碱-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;
}

3 个答案:

答案 0 :(得分:2)

考虑使用std::stolref)将字符串转换为long。 它允许您选择要使用的基数,这里是您的数字wiuth 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
}

答案 1 :(得分:1)

pow(base, i)使用浮点数,因此你对某些数字有一些精确度。

答案 2 :(得分:1)

超过double精度。

double的精度,pow()的返回值,对于至少DBL_DIG个有效小数位是精确的。 DBL_DIG 至少 10,通常为15 IEEE 754 double-precision binary

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

特别是,sum += pow(base,i)*value[14-i]作为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;
}