进制转换

进制转换的代码我写了好多次了,但是一直感觉自己没有掌握进制转换的精髓。

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值