我发现了从任何基地到基地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;
}
答案 0 :(得分:2)
考虑使用std::stol
(ref)将字符串转换为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
。最近的double
到29480883458974409
是29480883458974408
。因此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;
}