R进制转十进制
作者:
dabaodabao
,
2024-03-18 20:51:38
,
所有人可见
,
阅读 14
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
const int N=50;
char a[N];
double zsjz(char s[],int jz)
{
double d = 0;//存储十进制结果
string str(s);//用s初始化字符串str
int sy = str.find('.');//找到小数点的索引
string str1 = str.substr(0, sy);//整数部分
string str2 = str.substr(sy+1);//小数部分
//cout << str1 << " " << str2 << '\n';
double wqz = 1.0;//位权值,初始值:jz^0,整数部分位权值为整数
for(int i=str1.size()-1; i>=0; i--)//反向遍历,注意最后一个字符的索引
{
if(str1[i]>='0' && str1[i]<='9')
d += (str1[i]-'0') * wqz;
else
d += (str1[i]-'A'+10) * wqz;
wqz *= jz;//位权值为jz^1、jz^2、jz^3......
}
//cout << d << '\n';
wqz = pow(jz, -1);//位权值,初始值:jz^-1,小数部分位权值为小数
for(int i=0; i<str2.size(); i++)//正向遍历,不能str2.size()-1
{
if(str2[i]>='0' && str2[i]<='9')
d += (str2[i]-'0') * wqz;
else
d += (str2[i]-'A'+10) * wqz;
wqz *= pow(jz, -1);
}
//cout << d << '\n';
return d;
}
int main()
{
//freopen("xxx.in","r",stdin);
//freopen("yyy.out","w",stdout);
cout << 3*pow(16,2)+10*pow(16,1)+6*pow(16,0)+4*pow(16,-1)+11*pow(16,-2) << endl;
int j;
cin >> a >> j;//3A6.4B 16 输出:934.293
cout << zsjz(a,j) << endl;
//fclose(stdin);
//fclose(stdout);
return 0;
}