【题目描述】
本案例要求编写一个程序,从键盘录入一个字符串,将字符串转换为二进制数。比较简单的题目是,在转换时,将字符串中的每个字符单独转换成一个二进制数。在这里,我们增加难度,要求你输入一串数字,将这串数字的十进制值转换成二进制并输出。在样例实现时,可以使用Math类、String类、Scanner类等JAVA API常用方法。
输入样例:37
输出样例:100101
【解题思路】
首先要定义一个字符串,并输入一串数字。将字符串中的数字转换为可运算的普通数字,随后通过除留取余法转换为二进制数字,将二进制的各位数字保存在一个整型数组当中,最后逐位输出。
【解题过程】
(1)定义字符串并输入。
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
(2)将字符串转换为普通数字,并保存在一个double类型的数据中。在这一环节我们用到了Math类中的pow方法,该方法的返回值为一个double类型数据,因此我们在这里保存在一个double类型数据s中。在后续的程序中,如果我们需要运用到数据s,我们可以使用类型强转。
double s = 0;
Math m = null;
for(int i = str.length()-1,j = 0;i >= 0;i--,j++)
{
s = s + ((int)(str.charAt(i)-48)*m.pow(10, j));
}
(3)在进行转换之前,我们需要考虑一个问题。非2的整次方数使用除留取余法可以正常保存,但2的整次方数可能会丢失最高位,因此可以提前判断是否为2的整次方数。
boolean b = false;
for(int i = 0;;i++)
{
if(s == m.pow(2,i))
{
b = true;
break;
}
if(s < m.pow(2,i))
{
b = false;
break;
}
}
(4)同时,我们可以求出数组所需要的位数。
int j1;
for(j1 = 0;;j1++)
{
if(m.pow(2, j1) >= s)
break;
}
(5)对于2的非整次方数,使用除留取余法,使用数组保存各个二进制数位并逐个输出。
if(b == false)
{
int[] arr = new int[j1];
for(int i = j1-1;i >= 0;i--)
{
arr[i] = (int)s%2;
s = (int)s/2;
}
for(int i = 0;i < j1;i++)
{
System.out.print(arr[i]);
}
}
(6)对于2的整次方数,直接输出高位的1,在输出相应个数的0。
else
{
System.out.print("1");
for(int i = 0;i < j1;i++)
{
System.out.print("0");
}
}
【完整代码】
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
double s = 0;
Math m = null;
for(int i = str.length()-1,j = 0;i >= 0;i--,j++)
{
s = s + ((int)(str.charAt(i)-48)*m.pow(10, j));
}
boolean b = false;
for(int i = 0;;i++)
{
if(s == m.pow(2,i))
{
b = true;
break;
}
if(s < m.pow(2,i))
{
b = false;
break;
}
}
int j1;
for(j1 = 0;;j1++)
{
if(m.pow(2, j1) >= s)
break;
}
if(b == false)
{
int[] arr = new int[j1];
for(int i = j1-1;i >= 0;i--)
{
arr[i] = (int)s%2;
s = (int)s/2;
}
for(int i = 0;i < j1;i++)
{
System.out.print(arr[i]);
}
}
else
{
System.out.print("1");
for(int i = 0;i < j1;i++)
{
System.out.print("0");
}
}
}
}
谢谢观看