题目1118:数制转换 C++/Java

题目描述:

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

可以用字符串表示不同进制的整数。

C++代码:

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

#define MAX 1000

int main()
{
    int data[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    char suju[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    int a,b;
    char n[100];
    char stack[MAX];
    int i,j;
    while(scanf("%d%s%d",&a,n,&b)!=EOF)
    {
        int inda=0;
        int len = strlen(n);
        int top=-1;
        for(i=0;i<len;i++)
        {
            switch(n[i])
            {
            case '0':break;
            case '1':inda += (int)pow(a,len-i-1)*data[1];break;
            case '2':inda += (int)pow(a,len-i-1)*data[2];break;
            case '3':inda += (int)pow(a,len-i-1)*data[3];break;
            case '4':inda += (int)pow(a,len-i-1)*data[4];break;
            case '5':inda += (int)pow(a,len-i-1)*data[5];break;
            case '6':inda += (int)pow(a,len-i-1)*data[6];break;
            case '7':inda += (int)pow(a,len-i-1)*data[7];break;
            case '8':inda += (int)pow(a,len-i-1)*data[8];break;
            case '9':inda += (int)pow(a,len-i-1)*data[9];break;
            case 'a':
            case 'A':inda += (int)pow(a,len-i-1)*data[10];break;
            case 'b':
            case 'B':inda += (int)pow(a,len-i-1)*data[11];break;
            case 'c':
            case 'C':inda += (int)pow(a,len-i-1)*data[12];break;
            case 'd':
            case 'D':inda += (int)pow(a,len-i-1)*data[13];break;
            case 'e':
            case 'E':inda += (int)pow(a,len-i-1)*data[14];break;
            case 'f':
            case 'F':inda += (int)pow(a,len-i-1)*data[15];break;
            default:break;
            }
        }
        if(inda==0)
            stack[++top]='0';
        while(inda)
        {
            stack[++top]=suju[inda%b];
            inda=inda/b;
        }
        while(top>=0)
            printf("%c",stack[top--]);
        printf("\n");
    }
    return 0;
}
/**************************************************************
    Problem: 1118
    User: Carvin
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1108 kb
****************************************************************/

Java代码(RE,我也不知道为什么!贴在这,提供一种方法:)

import java.util.Scanner;
import java.math.*;
public class Main{
    public static void main(String[] args){
        int radixdata[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        char radixarray[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        long a,b;
        int i,j,k;
        String str;
        Scanner cin=new Scanner(System.in);
        while(cin.hasNext()){
            a=cin.nextLong();
            str=cin.nextLine();
            b=cin.nextLong();
            String result="";
            char strarray[]=str.toCharArray();
            int len=strarray.length;
            long radix=0;
            for(i=0;i<len;i++){
                switch(strarray[i])
                {
                case '0':break;
                case '1':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[1];break;
                    //Tenradix+=(int)pow(a,x)*data[1];break;
                case '2':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[2];break;
                case '3':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[3];break;
                case '4':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[4];break;
                case '5':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[5];break;
                case '6':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[6];break;
                case '7':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[7];break;
                case '8':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[8];break;
                case '9':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[9];break;
                case 'a':
                case 'A':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[10];break;
                case 'b':
                case 'B':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[11];break;
                case 'c':
                case 'C':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[12];break;
                case 'd':
                case 'D':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[13];break;
                case 'e':
                case 'E':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[14];break;
                case 'f':
                case 'F':
                    radix+=(int)Math.pow(a,len-i-1)*radixdata[15];break;
                default:break;
                }//switch
            }//for
            if(0==radix)
                System.out.print(0);
            while(radix>0){
                //System.out.print(radix%b);
                result=radixarray[(int) (radix%b)]+result;
                radix/=b;
            }
            System.out.println(result);
            //System.out.println();
        }//while
    }//main
}//Main
/**************************************************************
    Problem: 1118
    User: Carvin
    Language: Java
    Result: Runtime Error
****************************************************************/

再贴一段网上的神代码(Java):

import static java.lang.System.out;
    import java.io.BufferedInputStream;
    import java.util.Scanner;
    public class Main {
            static Scanner in = new Scanner(new BufferedInputStream(System.in));
            private static String string;
            private static int a, b;
            public static void main(String args[]) {
                    while (in.hasNext()) {
                            a = in.nextInt();
                            string = in.next();
                            b = in.nextInt();
                            out.println(Integer.toString(Integer.valueOf(string, a), b)
                                            .toUpperCase());
                    }
            }
    }
/**************************************************************
    Problem: 1118
    User: Carvin
    Language: Java
    Result: Accepted
    Time:300 ms
    Memory:27516 kb
****************************************************************/
时间: 2024-11-11 14:56:01

题目1118:数制转换 C++/Java的相关文章

java使用链栈实现数制转换

java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedstack; public class LinkStack { private Element base; private Element top; class Element { public Object data; public Element next; } /** * 初始化栈 * */ pu

数制转换

进制的转换可以借助强大的BigInteger,非常的方便. new java.math.BigInteger(num, from).toString(to); 表示num要转换的数从from源数的进制 转换成to的进制. 题目描述 求任意两个不同进制非负整数的转换(2进制-16进制),所给整数在long所能表达的范围之内.     不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F). 输入描述:     输入只有一行,包含三个整数a,n,

DS队列+堆栈--数制转换

题目描述 对于任意十进制数转换为k进制,包括整数部分和小数部分转换.整数部分采用除k求余法,小数部分采用乘k取整法例如x=19.125,求2进制转换 整数部分19, 小数部分0.125 19 / 2 = 9 … 1 0.125 * 2 = 0.25 … 0 9 / 2 = 4 … 1 0.25 * 2 = 0.5 … 0 4 / 2 = 2 … 0 0.5 * 2 = 1 … 1 2 / 2 = 1 … 0 1 / 2 = 0 … 1 所以整数部分转为 10011,小数部分转为0.001,合起来

数据结构--栈的基本操作及应用(数制转换)

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <math.h> #define TRUE 1 #define FALSE 0 #define ERROR 0 #define INFEASIBLE -1 typedef int Status; typedef int Boolean; typedef int SElemType; #define STACK_INIT_SI

题目551-成绩转换-nyoj20140811

#include <stdio.h>int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        if(n>=90)        printf("A\n");        if(n>=80&&n<90)        printf("B\n");         if(n>=70&&n<80)  

Java数组与列表转换的java.lang.ClassCastException

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; at com.bupt.acm.test.TestArrayList.main(TestArrayList.java:12) ava.lang.ClassCastException是进行强制类型转换的时候产生的异常,强制类型转换的前提是父类引用指向的对象的类

01:数制转换

01:数制转换 查看 提交 统计 提问 总时间限制:  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. 输出 输出包含一行,该

7、蛤蟆的数据结构笔记之七栈的应用之数制转换

7.蛤蟆的数据结构笔记之七栈的应用之数制转换 本篇名言:"人生意义的大小,不在乎外界的变迁,而在乎内心的经验." 上面两篇中我们实现了链栈和链队列,接下去哦我们看看实际中栈的应用场景.本次来看下栈在数制转换的作用. 欢迎转载,转载请标明出处: 1.  原理介绍 十进制N和其他进制数的转换时计算机实现计算的基本问题.简单算法如下: N=(N div d )x d + N modd 2.  实现 2.1         定义结构体 定义堆栈的结构体 typedef struct { int

数据结构实践——数制转换(栈)

本文是针对数据结构基础系列网络课程(3):栈和队列的实现项目. [项目 - 数制转换] 把十进制的整数转换为任一进制数输出.请利用栈设计算法,并实现程序. 提示:要转换为r进制,则原来的数逐次除以基数r(除完之后用商再除),直到商为0,得到的一系列余数的逆序就是转换结果.这里的"逆序",意味着后产生的余数,会先输出,后进先出,栈的机会来了-- [参考解答] 解法:头文件sqstack.h请见[顺序栈算法库],使用链栈也可以. #include <stdio.h> #incl