如何找到(x:g)的base10?

时间:2011-09-11 16:20:19

标签: java algorithm

我在作业结束时,对于正确的算法方法有点困惑。我需要找到一个数字的base10:用户给出的基数。

基本上我的程序所做的是接受用户输入,例如:407:8或1220:5等。

我想要输出的是这样的。

 INPUT:    407:8 
OUTPUT:    407 base 8 is 263 base 10

我正在考虑这种长期伸展的方式,但我相信有一种更简单的方法可以解决这个问题。

附件是我到目前为止所拥有的。谢谢你的期待!!

import javax.swing.JOptionPane;  //gui stuff
import java.util.Scanner;  // Needed for accepting input
import java.text.*;         //imports methods for text handling
import java.lang.Math.*;    //needed for math stuff*

 public class ProjectOneAndreD      //my class + program name
 {


public static void main(String[] args)  //my main
{
    String input1;      //holds user input
    int val=0, rad=0, check1=0;   //holds integer values user gives
   and check  for : handler
    double answer1=0;   //holds the answer!


        Scanner keyboard = new Scanner(System.in);  
  //creates new scanner class

        do      //will continue to loop if no : inputted
        {
           System.out.println("\t****************************************************");
        System.out.println("\t             Loading Project 1. Enjoy!              ");       //title
        System.out.println("\t****************************************************\n\n");

        input1 = JOptionPane.showInputDialog("INPUT: ","EXAMPLE:  160:2");  //prompts user with msgbox w/ example
        System.out.println("Program Running...");       //gives user a secondary notice that everything is ok..

        check1=input1.indexOf(":");     //checks input1 for the :

            if(check1==-1)              //if no : do this stuff
            {
                System.out.println("I think you forgot the ':'.");      //let user know they forgot
                JOptionPane.showMessageDialog(null, "You forgot the ':'!!!");   //another alert to user
            }
                else        //otherwise is they remembered :
                {
                    String numbers [] = input1.split(":"); //splits the string at :

                        val = Integer.parseInt(numbers[0]);   //parses [0] to int and assigns to val
                        rad = Integer.parseInt(numbers[1]);     //parses [1] to int and assigns to rad
                        //answer1 = ((Math.log(val))/(Math.log(rad)));  //mathematically finds first base then
                        //answer1 = Integer.parseInt(val, rad, 10);

                        JOptionPane.showMessageDialog(null, val+" base "+rad+" = BLAH base 10.");  //gives user the results
                        System.out.println("Program Terminated...");            //alerts user of program ending
                }

        }while(check1==-1);     //if user forgot : loop 

    }
}

3 个答案:

答案 0 :(得分:5)

您可以使用Integer.parseInt(s, radix)

answer = Integer.parseInt(numbers[0], rad);

您解析给定基数的数字。

答案 1 :(得分:2)

您只实现了用户界面。定义一个方法,将两个整数(基数和要转换的数字)作为参数,并返回转换后的数字。这不是很困难。 407:8表示

(7 * 8^0) + (0 * 8^1) + (4 * 8^2)

因此,你必须找到一种从407,然后是0,然后从4中提取7的方法。模运算符可以在这里帮助你。或者你可以将407视为一个字符串并逐个提取字符并将它们转换为一个整数。

答案 2 :(得分:2)

这很简单,只需用以下内容替换已注释掉的逻辑:

int total = 0;
for (int i = 0; val > Math.pow(rad, i); i++) {
    int digit = (val / (int) Math.pow(10, i)) % 10;
    int digitValue = (int) (digit * Math.pow(rad, i));
    total += digitValue;
}

总计有你的答案。逻辑很简单 - 我们做一些除法然后模数将数字拉出val,然后乘以适当的基数幂并加总。

或者,如果你想让它更有效率并失去指数:

int total = 0;
int digitalPower = 1;
int radPower = 1;
while (val > radPower) {
    int digit = (val / digitalPower) % 10;
    int digitValue = digit * radPower;
    total += digitValue;

    digitalPower *= 10;
    radPower *= rad;
}