首页 > 其他分享 >T258192 数字转换

T258192 数字转换

时间:2022-10-02 14:33:14浏览次数:45  
标签:10 转换 数字 pow sum else length T258192 进制

题目描述

已知一个 nn 进制数,将其转为 mm 进制,请你编程完成这个任务。

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16)n(2≤n≤16),第二行是一个nn进制数,若n>10n>10则用大写字母A-FA−F表示数码10-1510−15,并且该nn进制数对应的十进制的值不超过10000000001000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)m(2≤m≤16)。

输出格式

一个正整数,表示转换之后的mm进制数。

输入输出样例

输入 #1
16
FF
2
输出 #1
11111111

思路:

依然是熟悉的题目说啥你就干啥就可以做出来的题,只需要熟悉一下进制怎么互相转化即可

但是一定要记得输出的时候可不一定只有10或2进制,也是可以转16进制的!这是我第一次代码

#include<iostream>
#include<cmath>
using namespace std;
string s;
int n,m,sum;
int a[100000];
int main() {
    cin>>n>>s>>m;
    //进制转换为10进制
    for(int i=0;i<=s.length()-1;i++){
        if(s[i]>'9'){
            if(s[i]=='A')sum+=10*pow(n,s.length()-i-1);
            else if(s[i]=='B')sum+=11*pow(n,s.length()-1-i);
            else if(s[i]=='C')sum+=12*pow(n,s.length()-i-1);
            else if(s[i]=='D')sum+=13*pow(n,s.length()-i-1);
            else if(s[i]=='E')sum+=14*pow(n,s.length()-i-1);
            else if(s[i]=='F')sum+=15*pow(n,s.length()-i-1);
        }
        else
            sum+=(s[i]-'0')*pow(n,s.length()-i-1);
    }
    if(m==10){
        cout<<sum;
        return 0;
    }else{
        int i=0;
        while(sum){
            a[i++]=sum%m;
            sum/=m;
        }
        for(int j=i-1;j>=0;j--){
            cout<<a[j];
        }
    }
    return 0;
}

我一看,我趣,测试点红了俩,下载下来一看,居然把这个数字转回16进制了,所以我改了改代码(下面这个代码有注释)

#include<iostream>
#include<cmath>
using namespace std;
string s;
int n,m,sum;
int a[100000];
int main() {
    cin>>n>>s>>m;
    //进制转换为10进制
    for(int i=0; i<=s.length()-1; i++) {
        //如果当前这个字符比字符9的ASCLL码还大,因为题目保证除了0-9,A-F之外不会有别的东西出现,所以可以这么判断
        //因为A的ASCLL码比9的大
        if(s[i]>'9') {
            //然后一一对照加进sum里
            if(s[i]=='A')sum+=10*pow(n,s.length()-i-1);
            else if(s[i]=='B')sum+=11*pow(n,s.length()-1-i);
            else if(s[i]=='C')sum+=12*pow(n,s.length()-i-1);
            else if(s[i]=='D')sum+=13*pow(n,s.length()-i-1);
            else if(s[i]=='E')sum+=14*pow(n,s.length()-i-1);
            else if(s[i]=='F')sum+=15*pow(n,s.length()-i-1);
        } else//如果小于字符9的码,那就是正常数字,转化为int就可以了,方法是减去'0'
            sum+=(s[i]-'0')*pow(n,s.length()-i-1);
    }
    if(m==10) {//如果要转化为10进制那就不用算了,直接输出sum然后结束就行
        cout<<sum;
        return 0;
    } else {
        //把数字存进数组里,需要注意是倒着存的,假设sum是11,二进制就是1011,a数组里就是1101
        int i=0;
        while(sum) {
            a[i++]=sum%m;
            sum/=m;
        }
        //从后往前输出,因为他是倒着存的
        for(int j=i-1; j>=0; j--) {
            if(a[j]>=10) {
                //如果当前数字比10还大说明他肯定是一个字母
                //转换为字母然后输出这个字母
                char ss='A'+(a[j]-10);
                cout<<ss;
            } else {//如果比10小那就是数字了,直接输出
                cout<<a[j];
            }
        }
    }
    return 0;
}

 

 

标签:10,转换,数字,pow,sum,else,length,T258192,进制
From: https://www.cnblogs.com/Ghost1GM/p/16748730.html

相关文章