我在作业结束时,对于正确的算法方法有点困惑。我需要找到一个数字的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
}
}
答案 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;
}