zoukankan      html  css  js  c++  java
  • P1143 进制转换

    大致题意:

    • 给定一个n进制的数,把它转换为m进制的数。

    总体思路:

    • 以10进制为中间进制,

    • 把n进制的数转换为10进制,

    • 再转换为m进制,

    • 最后输出。

    然后说一说如何进行n进制转10进制10进制转m进制

    n进制转10进制

    • 我们有一种方式可以来表示一个n进制数: 将每个阿拉伯数字乘以一个以该数字所处位置为指数,以n为底数的幂之和的形式。例如 233(8) 可表示为 2×82+3×81+3×80 这样的形式。

    • 那么根据这个方式,我们就可以将n进制转换为10进制了。

    • 具体来说,我们从这个数的末尾往前推,以一个t变量表示以该数字所处位置为指数,以n为底数的幂,然后再用一个变量累加每次的乘积,最后就可以得到10进制的这个数了。

    • for(int i=sLen-1;i>=0;--i){//倒推,sLen表示字符串的长度
          num_10+=mp[s[i]]*t;//累加乘积,mp[s[i]]表示s[i]这个字符所代表的数字
          t*=n;//求前一位的“以该数字所处位置为指数,以n为底数的幂”
      }
      

    10进制转m进制

    • 10进制转m进制就好办了,以这个数不断模m,模出的数存到数组里,然后除以m,一直到这个数为0之后停止。

    • while(num_10){//不为0不退出
          ans[++tot]=ch[num_10%m];//存到数组里,ch[num_10%n]代表的是取模出来的数的字符(因为类似于11不能直接输出,需要变为字符)
          num_10/=m;//除以m
      }
      
    • 注: 答案应该是将ans数组反过来,因为每次取模的数都应该从后往前放,但是并不知道要放多少个,所以就"正着进去,反着输出"。

    Code:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <list>
    using namespace std;
    #define R read()
    #define GC getchar()
    #define ll long long
    #define ull unsigned long long
    #define INF 0x7fffffff
    #define LLINF 0x7fffffffffffffff
    ll read(){
        ll s=0,f=1;
        char c=GC;
        while(c<'0'||c>'9'){if(c=='-')f=-f;c=GC;}
        while(c>='0'&&c<='9'){s=s*10+c-'0';c=GC;}
        return s*f;
    }
    int n,m;
    string s;
    int sLen;
    int num_10,t=1;//nun_10是存放10进制数的变量,t是"以该数字所处位置为指数,以n为底数的幂"
    char ch[20]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    map<char,int> mp;
    char ans[100010];//记录答案的数组
    int tot;
    int main(){
        for(int i=0;i<16;++i){
            mp[ch[i]]=i;
        }
        cin>>n>>s>>m;
        sLen=s.length();
        //n进制转10进制
        for(int i=sLen-1;i>=0;--i){//倒推,sLen表示字符串的长度
            num_10+=mp[s[i]]*t;//累加乘积,mp[s[i]]表示s[i]这个字符所代表的数字
            t*=n;//求前一位的“以该数字所处位置为指数,以n为底数的幂”
        }
        //10进制转m进制
        while(num_10){//不为0不退出
            ans[++tot]=ch[num_10%m];//存到数组里,ch[num_10%n]代表的是取模出来的数的字符(因为类似于11不能直接输出,需要变为字符)
            num_10/=m;//除以m
        }
        for(int i=tot;i>=1;--i){//倒着输出
            printf("%c",ans[i]);
        }
        return 0;
    }
    
  • 相关阅读:
    Leetcode 814. 二叉树剪枝
    Leetcode 104. 二叉树的最大深度
    Leetcode 617. 合并二叉树
    Leetcode 226. 翻转二叉树
    Leetcode 654.最大二叉树
    【Leetcode】413. Arithmetic Slices
    【Leetcode】128. Longest Consecutive Sequence
    【Leetcode】605. Can Place Flowers
    【Leetcode】647. Palindromic Substrings
    高可用架构
  • 原文地址:https://www.cnblogs.com/FUXyao/p/12844999.html
Copyright © 2011-2022 走看看