您的位置:首页 > 其它

洛谷 P1143 进制转换

2018-03-13 21:45 239 查看
洛谷P1143 进制转换
本题题解为转载

题目描述

请你编一程序实现两种不同进制之间的数据转换。

输入输出格式

输入格式:
输入数据共有三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A~F表示数码10~15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。输出格式:
输出仅一行,包含一个正整数,表示转换之后的m进制数。

输入输出样例

输入样例#1: 复制
16
FF
2
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,l;                         //先把n进制转十进制,再把十进制转成m进制 
char njz[25],mjz[25];
int power(int n,int t)
{                                   //用来计算n进制下每一位的幂,从而转换成十进制
    int ans=1,i;
    for(i=0;i<t;i++)
    ans*=n;
    return ans;
}
int nzh()
{                                         //n进制转十进制
    int t,sjz=0;
    t=l;
    for(int i=0;i<=l;i++)
{
        if(njz[i]<='9')
        sjz+=power(n,t)*(njz[i]-'0');
        else
        sjz+=power(n,t)*(njz[i]-'A'+10);//这一位如果为字母,要转换成对应的十进制数
        t--;                            
    }
    return sjz;
}
void szh()
{                               //十进制转m进制
    int i=1,sj;
    sj=nzh();
    while(sj>0)
{
        if(sj%m<10)
            mjz[i]=sj%m+'0';
        else
            mjz[i]=sj%m-10+'A';//同上的特判,十六进制余11,11 11-10+‘A’为B 
        i++;
        sj/=m;
    }
    for(int j=i-1;j>=1;j--)  //此处没用栈,所以要从后往前输出
    putchar(mjz[j]);
}
int main()
{
    scanf("%d\n%s\n%d",&n,njz,&m);
    l=strlen(njz)-1;         //l就是n进制最高位的权
    szh();
    return 0;
}
输出样例#1: 复制
11111111
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: