进制转换的代码我写了好多次了,但是一直感觉自己没有掌握进制转换的精髓。
https://www.cnblogs.com/gaizai/p/4233780.html
好多博客都写的很棒。我前段时间看了一段代码就是m进制转换为n进制,代码特别短,但是很强大。我忘了,也找不到了。
一个p进制数转换为Q进制数
分为两步:
1.P进制数x转换为10进制数 y;
2.10进制数y转换为Q进制数z。
1.P进制数x转换为10进制数 y;
怎么转换呢?
10进制数y=d1d2d3……dn,它可以写成y=d1*pow(10,n-1)+d2*pow(10,n-2)+d3*pow(10,n-3)+……+dn-1*10+dn;
P进制数x为a1a2a3a4……an转换为 10进制数y为
y=a1*pow(P,n-1)+a2*pow(P,n-2)+a3*pow(P,n-3)+……+an-1*pow(P,1)+an;
int y=0,product=1;
while(x!=0)
{
y=y+(x%10)*product;
x=x/10;
product=product*P;
}
2.10进制数y转换为Q进制数z。
采用除基取余法。所谓的基就是需要转换成的进制Q,因此除基取余的意思就是每次将待转换数除以Q,然后将得到的余数作为低位存储,而商则继续除以Q并进行上面的操作,最后将为0时,将所有位从高到低输出就可以得到z。
其实描述上可能不理解,但是你自己写一个10进制数转换为2进制数就会理解除基取余法。(从底向上)
这时就不能使用while语句,因为若是使用while语句y==0的话就会跳出循环。实际上正确结果应该是z[0]=0;
int z[40],num=0;
do
{
z[num++]=y%Q;
y=y/Q;
}while(y!=0);
就是分为这两步,网上很多大佬字符串的方法啥都很好,本渣渣就用这个,但是大数能不能过不确定,时间复杂度为O(n)。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
//P进制数x转换为10进制数y
int P,x;
cin>>P>>x;
int y=0,product=1;
while(x!=0)
{
y=y+(x%10)*product;
x=x/10;
product=product*P;
}
cout<<y<<endl;
//10进制的数a+b转换为d进制
int a,b,d;
cin>>a>>b>>d;
int c=a+b;
int z[100]={0},num=0;
do
{
z[num++]=c%d;
c=c/d;
}while(c!=0);
for(int i=num-1;i>=0;i--)
{
cout<<z[i];
}
cout<<endl;
return 0;
}