【九度OJ】题目1118:数制转换 解题报告

91 篇文章 0 订阅
90 篇文章 33 订阅

【九度OJ】题目1118:数制转换 解题报告

标签(空格分隔): 九度OJ


原题地址:http://ac.jobdu.com/problem.php?pid=1118

题目描述:

求任意两个不同进制非负整数的转换(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

Ways

每次都会因为一些细节出错,本题中,注意判断法按时都是以带有等号的,最后输出时别忘了加上0的ASCii,最后,注意数组是char,应该以%c形式输出。

进制之间的转换,首先转换成10进制,再转换成任意进制。转换成10进制的时候,注意,对于A-Z的表示的数字的转换,使用ASCII码的形式转换。

另外在转换过程中,一定要注意数字的正序和倒序等等问题,防止出错。

另外发现java的版本很方便啊,以后数制转换就用Java了哈哈哈。

#include <stdio.h>
#include <string.h>

int main() {
    int a, b;
    char n[20];
    while (scanf("%d%s%d", &a, n, &b) != EOF) {
        //任意进制转10进制
        int len = strlen(n);
        int trans = 0;
        for (int i = 0; i < len; i++) {
            int x = 0;
            if (n[i] >= '0' && n[i] <= '9') {//都有等于号
                x = n[i] - '0';
            } else if (n[i] >= 'a' && n[i] <= 'z') {
                x = 10 + n[i] - 'a';
            } else if (n[i] >= 'A' && n[i] <= 'Z') {
                x = 10 + n[i] - 'A';
            }
            trans = a * trans + x;
        }
        //下面10进制转成任意进制
        int temp = trans;
        char ans[20];
        int size = 0;
        do {
            int end = temp % b;
            ans[size++] = (end >= 10) ? (end - 10 + 'A') : (end + '0');
            //加上0的ASCII
            temp /= b;
        } while (temp > 0);
        for (int i = size - 1; i >= 0; i--) {
            printf("%c", ans[i]);//以字符形式输出,不是整数
        }
        printf("\n");
    }

    return 0;
}

写了个通用的change函数,利用BigInteger类可以轻松的实现数制转换。,就是BigeIteger.toString(to)方法。

这个题目中因为要求最终结果是大写字母,所以使用了toUpperCase(),否则默认的是小写字母。

import java.util.*;
import java.math.*;

public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String line = scanner.nextLine();
            String[] params = line.split(" ");
            System.out.println(change(params[1],
                    Integer.parseInt(params[0]),
                    Integer.parseInt(params[2])));
        }
    }
    //num 要转换的数 from源数的进制 to要转换成的进制
    private static String change(String num, int from, int to) {
        return new BigInteger(num, from).toString(to).toUpperCase();
    }
}

Date

2017 年 3 月 6 日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值