进制转化问题

C/C++实现:

列题1-1:
Description
计算A和B的和
Input
每次输入一组用例,用例的第一行包含一个正整数T,接下来T行,每行包含正整数M,数字A,正整数N和数字B,M表示数字A是M进制,同理,N表示数字B是N进制。
题目保证,1<M,N<20,且数字A和B只会由数字0~9和大写字母组成。

Output
计算M进制的数字A和N进制的数字B之和,结果用16进制表示。
 代码以及解析如下:

#include<bits/stdc++.h> 
using namespace std;
long long int to_Dec(string s,int n)// 将N进制的s转为10进制
{
     bool flg=true;// 默认是正数,用于判断数的正负 
     long long int re=0;// 作为10进制返回的结果数
      if(s[0]=='-') flg=false;//此时数为负数,改变. 

    for(int i=s.length()-1,len=s.length()-1;i>=0;i--)//for循环,设定长度变量len; 

    {

        if(i==0&&s[i]=='-') continue;//决定数的正负; 

        char c=s[i];

c=toupper(c);//转化成大写字符 

        int tmp='0'<=c&&c<='9'?c-'0':c-'A'+10;   //int('0')==48;

        //如果此时的字符是'0'-'9'则c-'0'转成数值如果是ABCD....这种那么需要c-'A'+10; 

        re+=tmp*pow(n,len-i);

        //这步骤是关键:N进制转化成十进制,简单的理解就是将每一位字符串转化成数值之后依次相乘10 

    }

    if(flg==false) re=-re;// 如果是负数加一个负号

    return re;

}

string to_Hex(long long int n,int m) // 将10进制数转为m进制

{

    bool flg=true;// 默认是正数

    string re="";// 存放结果的一个变量

    if(n<0) {flg=false;n=-n;}//如果是负数那么需要做出改变 

    while(n)

    {

        int tmp=n%m;// 得到余数

        char c=tmp>9?'A'+tmp-10:tmp+'0';//将数值转化成字符保存到整体的字符串中

        //如果是大于9的数值。。。。 数值转化成字符串的形式 

        re=c+re;//字符相加(连接); 

        n/=m;// 更新n的值

    }

    if(flg==false) re='-'+re;

    return re;

}

int main()

{

    int m,n,t;string a,b;//m,n表示进制问题:m进制,n进制 

    cin>>t;//一共有t组数需要输入; 

    while(t--)

    {

        cin>>m>>a>>n>>b;//开始输入一组的数据 

        cout<<to_Hex(to_Dec(a,m)+to_Dec(b,n),16)<<endl;//调用函数转化然后输出 

    }

    return 0;

 

}
 简单的理解可以记为:
字符串表示的Nj进制数转化成十进制的时候:字符串中的第 i 位数转化成数值之后乘以10的i次方累加之和;
十进制的书转化成N进制的时候:     转化后的结果同样用字符串来表示当数值num不为0的时候可以采取while循环,num%m取余然后加入字符串中。
注意10之后的数值都是用A,B,C,D,E来相应表示的所以在形式转化上需要注意。以及数值的正负判断同样需要注意

C/C++实现:

列题1-1:
Description
计算A和B的和
Input
每次输入一组用例,用例的第一行包含一个正整数T,接下来T行,每行包含正整数M,数字A,正整数N和数字B,M表示数字A是M进制,同理,N表示数字B是N进制。
题目保证,1<M,N<20,且数字A和B只会由数字0~9和大写字母组成。

Output
计算M进制的数字A和N进制的数字B之和,结果用16进制表示。
 代码以及解析如下:

#include<bits/stdc++.h> 
using namespace std;
long long int to_Dec(string s,int n)// 将N进制的s转为10进制
{
     bool flg=true;// 默认是正数,用于判断数的正负 
     long long int re=0;// 作为10进制返回的结果数
      if(s[0]=='-') flg=false;//此时数为负数,改变. 

    for(int i=s.length()-1,len=s.length()-1;i>=0;i--)//for循环,设定长度变量len; 

    {

        if(i==0&&s[i]=='-') continue;//决定数的正负; 

        char c=s[i];

c=toupper(c);//转化成大写字符 

        int tmp='0'<=c&&c<='9'?c-'0':c-'A'+10;   //int('0')==48;

        //如果此时的字符是'0'-'9'则c-'0'转成数值如果是ABCD....这种那么需要c-'A'+10; 

        re+=tmp*pow(n,len-i);

        //这步骤是关键:N进制转化成十进制,简单的理解就是将每一位字符串转化成数值之后依次相乘10 

    }

    if(flg==false) re=-re;// 如果是负数加一个负号

    return re;

}

string to_Hex(long long int n,int m) // 将10进制数转为m进制

{

    bool flg=true;// 默认是正数

    string re="";// 存放结果的一个变量

    if(n<0) {flg=false;n=-n;}//如果是负数那么需要做出改变 

    while(n)

    {

        int tmp=n%m;// 得到余数

        char c=tmp>9?'A'+tmp-10:tmp+'0';//将数值转化成字符保存到整体的字符串中

        //如果是大于9的数值。。。。 数值转化成字符串的形式 

        re=c+re;//字符相加(连接); 

        n/=m;// 更新n的值

    }

    if(flg==false) re='-'+re;

    return re;

}

int main()

{

    int m,n,t;string a,b;//m,n表示进制问题:m进制,n进制 

    cin>>t;//一共有t组数需要输入; 

    while(t--)

    {

        cin>>m>>a>>n>>b;//开始输入一组的数据 

        cout<<to_Hex(to_Dec(a,m)+to_Dec(b,n),16)<<endl;//调用函数转化然后输出 

    }

    return 0;

 

}
 简单的理解可以记为:
字符串表示的Nj进制数转化成十进制的时候:字符串中的第 i 位数转化成数值之后乘以10的i次方累加之和;
十进制的书转化成N进制的时候:     转化后的结果同样用字符串来表示当数值num不为0的时候可以采取while循环,num%m取余然后加入字符串中。
注意10之后的数值都是用A,B,C,D,E来相应表示的所以在形式转化上需要注意。以及数值的正负判断同样需要注意

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲游山河十万里

你的鼓励是我们创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值