1.由十进制转化为x进制
#include <iostream>
#include <cstring>
using namespace std;
void change1(int num,int x); //十进制转2到16进制的数
int main()
{
int x; //x为进制
int num;
cout <<"Please input a number:";
cin>>num;
cout <<"\n请输入进制";
cin>>x;
change1(num,x);
return 0;
}
void change1(int num,int x)
{
int n=num;
int i=0;
int str1[100];
while (n>=x)
{
str1[i] = n%x; //取余放入数组
n = n/x;
i++;
}
str1[i]=n; //最后无法除的商放入数组第一个数
for(;i>-1;i--)
{
if(str1[i]>=10)
{
cout <<(char)('A'+str1[i]-10); //将十及其以上的数字转化为A~F,再转化为char类型输出
}
else
cout <<str1[i];
}
return ;
}
2.由x进制转化为十进制
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int checkx(string &a,int n); //检查数字与进制是否相符
void change1(string &a,int n); //由x进制转为10进制
int main()
{
int n;
int fact=0;
string a;
cout <<"请输入数字:";
cin>>a;
cout<<"\n请输入它的进制:";
cin>>n;
fact = checkx(a,n);
if(fact == 1)
{
change1(a,n);
}
else
cout <<"ERROR! 请输入正确数字"<<endl;
return 0;
}
int checkx(string &a,int n)
{
for (int i = a.size()-1;i>-1;i--)
{
if(a[i]<='F'&&a[i]>='A')
{
if((a[i]-55)>=n) //转化为数字再与进制数相比,不符合则error
return 0;
}
else
{
if(a[i]-'0'>=n)
return 0;
}
}
return 1;
}
//每个位数转化为十进制,在相加得其十进制数
void change1(string &a,int n)
{
int s=0,c=0; //c为位数决定的次方
for(int i=a.size()-1;i>-1;i--)
{
if(a[i]<='F'&&a[i]>='A') //A为10,A减55得10,所以B减55为11,即可将A~F转化为数字
{
s+=(a[i]-55)*pow(n,c);
}
else
s+=(a[i]-'0')*pow(n,c);
c++;
}
cout <<s;
}
3.任意进制相加
#include <iostream>
#include <string>
using namespace std;
void Add(int n,string &a,string &b,int len1,int len2); //a为较长的数字 b为较小的数字
int main()
{
int n; //进制
string a;
string b;
cout <<"输入进制:";
cin >> n;
cout <<"\n输入数字a:";
cin>>a;
cout <<"\n输入数字b:";
cin>>b;
int len2,len1;
len1 = a.size();
len2 = b.size();
if(len1>=len2) //将较大的数组放在前面,不用重复步骤
Add(n,a,b,len1,len2);
else
Add(n,b,a,len2,len1);
return 0;
}
void Add(int n,string &a,string &b,int len1,int len2)
{
int i = len1-1,j=len2-1,k=0; //k为数组下标
int s[100]={}; //将string转化为数字数组
while(j>=0)
{
int flag = 0; //记录a,b有多少个是A~F,便于后面转化为数字的计算
if(a[i]>='A'&&a[i]<='F')
{
flag ++;
}
if(b[j]>='A'&&b[j]<='F')
{
flag ++;
}
if(flag == 2)
{
s[k] = a[i]+b[j]-110; //有一个flag就减55(将A转为10)
if(s[k]>=n)
{
s[k] = s[k]-n; //超过进制数就进一
s[k+1] = s[k+1]+1;
}
}
if(flag == 1)
{
s[k] = a[i]+b[j]-'0'-55;
if(s[k]>=n)
{
s[k] = s[k]-n;
s[k+1] = s[k+1]+1;
}
}
if(flag == 0)
{
s[k] = a[i]+b[j]-'0'-'0';
if(s[k]>=n)
{
s[k] = s[k]-n;
s[k+1] = s[k+1]+1;
}
}
j--;
i--;
k++;
}
while (i>=0) //此时短的b已经加完,将剩下的a转为数字代入数组中
{
if(a[i]>='A'&&a[i]<='F')
s[k]+=a[i]-55;
else
s[k]+=a[i]-'0';
if(s[k]>=n) //要判断之前进的一,再与剩下的a那位相加会超出进制数,若有则再进一
{
s[k] = s[k]-n;
s[k+1]++;
}
k++;
i--;
}
if(s[k]!=0) //若最后到a的最后一位带入数组还进一,则输出比a元素个数多一位,否则就输出与a相同个数
{
for(k=len1;k>=0;k--)
{
if(s[k]>=10)
cout<<char(s[k]+55);
else
cout <<s[k];
}
}
else
{
for(k=len1-1;k>=0;k--)
{
if(s[k]>=10)
cout<<char(s[k]+55);
else
cout <<s[k];
}
}
}