十进制转N进制

上网看进制转换都是各种繁琐代码

可是数学解法就很简洁。

如 12(10)转N(2)

12/2=6 ...... 0

6/2=3 ...... 0

3/2=1 ...... 1

1/2=0 ...... 1

如图:

所以12(10)=1100(2) 注意!!是倒序输出

那么此时就可以把他放入数组并倒序输出

#include<bits/stdc++.h>
using namespace std;

// 取余
int main(){
    int a[10001]={};
    long long num,N,i=0;
    cin >> num >> N;
    while (num) {
        int temp = num%N;
        num/=N;
        a[i++]=temp;
    }
    for (int j=0;j<i;j++) {
        cout << a[i-j-1];
    }
    return 0;
}

但这样有个bug,转十以上进制时,要用字母,如

123(10)=N(16)

123/16=7 ......11(B)

7/16=0 ......7

123(10)=7B(16)

如下表

 

字母ABCDEF
十进制101112131415
二进制101010111100110111101111
八进制121314151617

所以将数组更改为char型

char a[10001]={};

同时进行判断,大于十时用 A+余数-10 来求出字母,否则直接加上0

这样是为了让所有数都转为char型(当然,直接用数组也可以,只要强转char就好)

if (s>=10) a[i++]=char('A'+s-10);
else a[i++]=char(s+'0');

完整代码

#include<bits/stdc++.h>
using namespace std;

// 取余
int main(){
    char a[10001]={};
    long long num,n,i=0;
    cin >> num >> n;
    while (num) {
        int s = num%n;
        num/=n;
        // 英文输出判断j
        if (s>=10) a[i++]=char('A'+s-10);
        else a[i++]=char(s+'0');
    }
    for (int j=0;j<i;j++) {
        cout << a[i-j-1];
    }
    return 0;
}

这道题也是洛谷 B2141 的解,但注意,num一定要设为long long 不然又一个点过不去。

虽然这样的时间复杂度不是最快的,但简单好写。我自己认为比网上那些快但难懂的好。
 

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值