Bailian2710 数制转换(POJ NOI0113-01)【进制】

问题链接POJ NOI0113-01 数制转换

原题出处Bailian2710 数制转换

 


总时间限制:

1000ms

内存限制:

65536kB

描述

求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。

输入

输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。
a,b是十进制整数,2 =< a,b <= 16。

输出

输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。

样例输入

15 Aab3 7

样例输出

210306

来源

2005~2006医学部计算概论期末考试

 

 


问题分析

  这是一个进制转换的问题。

  据说阿拉伯数字是印度人发明的。今天,采用阿拉伯数字的记数法被人们普遍采用。而且人们使用的是10进制。

  然而,与计算机有关的常用的进制有10进制、8进制和16进制。

程序说明

  程序中,函数convert()用于将数s从a进制转换为b进制。

 


 

AC的C语言程序:

 

/* Bailian2710 数制转换 */

#include <stdio.h>
#include <ctype.h>

#define N 72
char s[N], ans[N];

void convert(int a, char s[], int b)
{
    long val, dcount, digit;
    int i, j;

    val = 0;
    for(i=0; s[i]; i++) {
        if(isdigit(s[i]))
            val = val * a + s[i] - '0';
        else
            val = val * a + toupper(s[i]) - 'A' + 10;
    }

    dcount = 0;
    while(val) {
        digit = val % b;
        val /= b;

        ans[dcount++] = ((digit >= 10) ? 'A' - 10 : '0') + digit;
    }
    if(dcount == 0) {
        ans[dcount++] = '0';
        ans[dcount] = '\0';
    } else
        ans[dcount] = '\0';

    // reverse
    for(i=0, j=dcount-1; i<j; i++, j--) {
        char c = ans[i];
        ans[i] = ans[j];
        ans[j] = c;
    }
}

int main(void)
{
    int a, b;

    scanf("%d%s%d", &a, s, &b);

    convert(a, s, b);

    printf("%s\n", ans);

    return 0;
}

 

 

 

 

 

AC的C++语言程序:

 

#include <iostream>
#include <string>
#include <ctype.h>

using namespace std;

string convert(int a, string& s, int b)
{
    long val, dcount, digit;
    char result[72], c;
    string ans;

    val = 0;
    for(int i=0; i<(int)s.size(); i++) {
        if(isdigit(s[i]))
            val = val * a + s[i] - '0';
        else
            val = val * a + toupper(s[i]) - 'A' + 10;
    }

    dcount = 0;
    while(val) {
        digit = val % b;
        val /= b;

        result[dcount++] = ((digit >= 10) ? 'A' - 10 : '0') + digit;
    }
    if(dcount == 0) {
        result[dcount++] = '0';
        result[dcount] = '\0';
    } else
        result[dcount] = '\0';

    // reverse
    for(int i=0, j=dcount-1; i<j; i++, j--) {
        c = result[i];
        result[i] = result[j];
        result[j] = c;
    }

    ans = result;

    return ans;
}

int main()
{
    int a, b;
    string s;

    cin >> a >> s >> b;

    cout << convert(a, s, b) << endl;

    return 0;
}

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值