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来相应表示的所以在形式转化上需要注意。以及数值的正负判断同样需要注意