A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hongyu2017 中级黑马   /  2017-5-19 22:08  /  1662 人查看  /  14 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

虽然最后还是完成了,但是是真的难受,为啥写个转换这么复杂,有没有简单一点的方法。。。还有就是帮我看看有没有bug
/**
* 进制自动转换
* @author hang
* 2017/5/18
*/
package com.hy.Test;

import java.util.ArrayList;
import java.util.Scanner;

public class Test6 {

        /**
         * main主程序
         * @param args
         */
        public static void main(String[] args) {
                while(true){
                        System.out.println("请输入数据(如果数据太大会无法转换):");
                        Scanner sc=new Scanner(System.in);
                        String str=sc.nextLine();
                        String kind=findkind(str);
                        if(kind.equals("else")){
                                System.out.println("输入错误,请重新输入");
                                continue;
                        }
                        System.out.println("输入为"+kind);
                        System.out.println("请输入要转换的进制格式:");
                        String fkind=sc.nextLine();
                        if(!fkind.equals("二进制")&&!fkind.equals("十进制")&&!fkind.equals("十六进制")&&!fkind.equals("八进制")){
                                System.out.println("进制输入错误,请重新开始输入");
                                continue;
                        }
                        if(fkind.equals(kind)){
                                System.out.println("进制相同,无需转换");
                                continue;
                        }
                        String tfnum=transform(str,kind,fkind);
                        System.out.println(kind+":"+str+"转换为----"+fkind+":"+tfnum);
                }
        }

        /**
         * 字符型转为int型
         * @param c
         * @return d
         */
        private static int tcti(char c){
                int i=0;
                int d=0;
                char chh='0';
                while(true){
                        if(c==chh){
                                d=i;
                                break;
                        }else{
                                chh=(char) (chh+1);
                                i++;
                        }
                }
                return d;
        }
        /**
         * int型转换为字符型
         *
         */
        private static char titc(int x){
                int i=0;
                char ch='0';
                char c;
                while(true){
                        if(x==i){
                                c=ch;
                                break;
                        }else{
                                ch=(char) (ch+1);
                                i++;
                        }
                }
                return c;
        }
        /**
         * 找到输入数据的进制类型
         * 0b为二进制,0为八进制,整数为十进制,0x为十六进制
         * @param str
         * @return kind
         */
        private static String findkind(String str){
                char [] ch=str.toCharArray();
                String kind="else";
                if(ch[0]=='0'&&ch.length>1&&ch[1]!='b'&&ch[1]!='x'){
                        kind="八进制";
                        for(int i=1;i<ch.length;i++){
                                if(ch[i]>'7'||ch[i]<'0'){
                                        kind="else";
                                }
                        }
                        return kind;
                }
                if(ch[0]=='0'&&ch[1]=='b'&&ch.length>2){
                        if(ch[1]=='b'){
                                kind="二进制";
                        }
                        for(int i=2;i<ch.length;i++){
                                if(ch[i]>'1'||ch[i]<'0'){
                                        kind="else";
                                }
                        }
                        return kind;
                }

                if(ch[0]=='0'&&ch[1]=='x'&&ch.length>2){
                        if(ch[1]=='x'){
                                kind="十六进制";
                        }
                        for(int i=2;i<ch.length;i++){
                                if(ch[i]<'0'||(ch[i]>'9'&&ch[i]<'a')||ch[i]>'f'){
                                        kind="else";
                                }
                        }
                        return kind;
                }
               
                if(ch[0]>='0'&&ch[0]<='9'&&ch.length>1){
                        kind="十进制";
                        for(int i=1;i<ch.length;i++){
                                if(ch[i]>'9'||ch[i]<'0'){
                                        kind="else";
                                        break;
                                }
                        }
                        return kind;
                }
                if(ch.length==1&&ch[0]<='9'&&ch[0]>='0'){
                        kind="十进制";
                        return kind;
                }
                return kind;
        }
        /**
         * 进制转换,ArrayList接收
         * @param str
         * @param kind
         * @return ssss
         */
        private static String transform(String str,String kind,String fkind){
                String ssss="";
                int sum=0;
                char [] ch=str.toCharArray();
                int leng=ch.length;
                char [] tench = null;
                if(kind.equals("二进制")){
                        for(int i=2;i<leng;i++){
                                sum+=Math.pow(2, leng-i-1)*tcti(ch[i]);
                        }
                }else if(kind.equals("八进制")){
                        for(int i=1;i<leng;i++){
                                sum+=Math.pow(8, leng-i-1)*tcti(ch[i]);
                        }
                }else if(kind.equals("十六进制")){
                        for(int i=2;i<leng;i++){
                                int st;//十六进制每位的数据
                                switch(ch[i]){
                                        case 'a':
                                                st=10;
                                                break;
                                        case 'b':
                                                st=11;
                                                break;
                                        case 'c':
                                                st=12;
                                                break;
                                        case 'd':
                                                st=13;
                                                break;
                                        case 'e':
                                                st=14;
                                                break;
                                        case 'f':
                                                st=15;
                                                break;
                                        default:
                                                st=tcti(ch[i]);
                                }
                                sum+=Math.pow(16, leng-i-1)*st;
                        }
                }else{//十进制
                        for(int i=0;i<leng;i++){
                                sum+=Math.pow(10, leng-i-1)*tcti(ch[i]);
                        }
                }
                if(fkind.equals("十进制")){
                        for(int i=11;i>=0;i--){//这段循环是为了给字符数组分配内存
                                for(int j=9;j>0;j--){
                                        if((sum-Math.pow(10, i)*j)>=0){
                                                tench=new char[i+1];
                                                break;
                                        }
                                }
                                if(tench!=null){
                                        break;
                                }
                        }
                        for(int i=tench.length-1;i>=0;i--){
                                for(int j=9;j>=0;j--){
                                        if((sum-Math.pow(10, i)*j)>=0){
                                                sum-=Math.pow(10, i)*j;
                                                tench[tench.length-i-1]=titc(j);
                                                break;
                                        }
                                }
                        }
                }else if(fkind.equals("十六进制")){
                        for(int i=11;i>=0;i--){//这段循环是为了给字符数组分配内存
                                for(int j=15;j>0;j--){
                                        if((sum-Math.pow(16, i)*j)>=0){
                                                tench=new char[i+3];
                                                break;
                                        }
                                }
                                if(tench!=null){
                                        break;
                                }
                        }
                        tench[0]='0';
                        tench[1]='x';
                        for(int i=tench.length-3;i>=0;i--){
                                for(int j=15;j>=0;j--){
                                        if((sum-Math.pow(16, i)*j)>=0){
                                                sum-=Math.pow(16, i)*j;
                                                switch(j){
                                                case 10:
                                                        tench[tench.length-i-1]='a';
                                                        break;
                                                case 11:
                                                        tench[tench.length-i-1]='b';
                                                        break;
                                                case 12:
                                                        tench[tench.length-i-1]='c';
                                                        break;
                                                case 13:
                                                        tench[tench.length-i-1]='d';
                                                        break;
                                                case 14:
                                                        tench[tench.length-i-1]='e';
                                                        break;
                                                case 15:
                                                        tench[tench.length-i-1]='f';
                                                        break;
                                                default:
                                                        tench[tench.length-i-1]=titc(j);
                                                }
                                                break;
                                        }
                                }
                        }
                }else if(fkind.equals("八进制")){
                        for(int i=13;i>=0;i--){//这段循环是为了给字符数组分配内存
                                for(int j=7;j>0;j--){
                                        if((sum-Math.pow(8, i)*j)>=0){
                                                tench=new char[i+2];
                                                break;
                                        }
                                }
                                if(tench!=null){
                                        break;
                                }
                        }
                        tench[0]='0';
                        for(int i=tench.length-2;i>=0;i--){
                                for(int j=7;j>=0;j--){
                                        if((sum-Math.pow(8, i)*j)>=0){
                                                sum-=Math.pow(8, i)*j;
                                                tench[tench.length-i-1]=titc(j);
                                                break;
                                        }
                                }
                        }
                }else{
                        for(int i=32;i>=0;i--){//这段循环是为了给字符数组分配内存
                                for(int j=1;j>0;j--){
                                        if((sum-Math.pow(2, i)*j)>=0){
                                                tench=new char[i+3];
                                                break;
                                        }
                                }
                                if(tench!=null){
                                        break;
                                }
                        }
                        tench[0]='0';
                        tench[1]='b';
                        for(int i=tench.length-3;i>=0;i--){
                                for(int j=1;j>=0;j--){
                                        if((sum-Math.pow(2, i)*j)>=0){
                                                sum-=Math.pow(2, i)*j;
                                                tench[tench.length-i-1]=titc(j);
                                                break;
                                        }
                                }
                        }
                }
                ssss=String.valueOf(tench);
                return ssss;
        }
}


结果显示:
请输入数据(如果数据太大会无法转换):
0x4f
输入为十六进制
请输入要转换的进制格式:
十进制
十六进制:0x4f转换为----十进制:79
请输入数据(如果数据太大会无法转换):
0x4f
输入为十六进制
请输入要转换的进制格式:
二进制
十六进制:0x4f转换为----二进制:0b1001111
请输入数据(如果数据太大会无法转换):
0x4f
输入为十六进制
请输入要转换的进制格式:
八进制
十六进制:0x4f转换为----八进制:0117
请输入数据(如果数据太大会无法转换):


14 个回复

倒序浏览
作为一个快毕业的黑马学员!我可以很负责任的告诉你!没必要在进制转换上纠结!即使你现在很明白了!后来还是会忘记!并且!以后基本用不上!
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
momoko900415 发表于 2017-5-19 22:17
作为一个快毕业的黑马学员!我可以很负责任的告诉你!没必要在进制转换上纠结!即使你现在很明白了!后来还 ...

写科学计算器有用
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
6666666666
回复 使用道具 举报
这是就业班?
回复 使用道具 举报
决明子 发表于 2017-5-19 23:50
这是就业班?

不是,毕业设计过了,在学校无聊做的
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
沈唁 黑马帝 2017-5-20 09:14:26
9#
回复 使用道具 举报
加油,慢慢来!!!
回复 使用道具 举报
进制问题只是作为一个了解内容
回复 使用道具 举报
hongyu2017 发表于 2017-5-20 03:02
不是,毕业设计过了,在学校无聊做的

{:8_474:}{:8_474:}{:8_474:}
回复 使用道具 举报
6666666666
回复 使用道具 举报
回复 使用道具 举报
果真一脸懵逼
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马