注意看输入的数的范围是不是在int里和输出的数是否在int类型里。int的取值范围为(-2147483648~2147483647),占用4个字节(-231 到 231-1)
,如果在范围内,则可以使用标准库。
十进制转成十六进制:
Integer.toHexString(int i)
十进制转成八进制
Integer.toOctalString(int i)
十进制转成二进制
Integer.toBinaryString(int i)
其他进制转为十进制:
输出的数的范围要在int里
十六进制转成十进制
Integer.valueOf("FFFF",16).toString()
八进制转成十进制
Integer.valueOf("876",8).toString()
二进制转十进制
Integer.valueOf("0101",2).toString()
parseInt(String s, int radix)
使用第二个参数指定的基数,将==字符串参数==解析为有符号的整数。
————————————————
给出一个非负整数,将它表示成十六进制的形式。
输入格式
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
提示:十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
思路:
这道题有两个地方需要注意:
1.输入数 a 的范围,a的范围是在 int 类型里,于是我们可以直接调用 java标准库。
2.标准库里的表示是用小写字母表示的,因此我们需要在调用库上再加点东西。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
int x=scn.nextInt();
ystem.out.println(Integer.toHexString(x).toUpperCase());
}
}
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
思路:假如我们按照8位去算,FFFFFFFF. 超出 int 能表示的范围,所以不能够用标准库
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
String s=scn.next();
int length=s.length();
long sum=0;
for(int i=0;i<length;i++)
{
if(s.charAt(i)=='A')
sum=sum+(long)(10*Math.pow(16,length-1-i));
else if(s.charAt(i)=='B')
sum=sum+(long)(11*Math.pow(16,length-1-i));
else if(s.charAt(i)=='C')
sum=sum+(long)(12*Math.pow(16,length-1-i));
else if(s.charAt(i)=='D')
sum=sum+(long)(13*Math.pow(16,length-1-i));
else if(s.charAt(i)=='E')
sum=sum+(long)(14*Math.pow(16,length-1-i));
else if(s.charAt(i)=='F')
sum=sum+(long)(15*Math.pow(16,length-1-i));
else
sum=sum+(long)(Integer.parseInt(s.substring(i, i+1))*Math.pow(16,length-1-i));
}
System.out.println(sum);
}
}
练习3:十六进制转化为八进制
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。按从小到大的顺序输出满足条件的四位十进制数。
注意循环的范围是1000-9999.四位数
public class Main {
public static void main(String[] args) {
for (int i = 1000; i < 10000; i++) {
if(is_palindrome(i))
System.out.println(i);
}
}
public static boolean is_palindrome(int i) {
int sum=0;
int j=i;
while(i>0)
{
int a=i%10;
sum=sum*10+a;
i=i/10;
}
return sum==j;
}
}
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
思路:将问题分解成两部分,
1.求出各位数的和是n的数
2.求回文数
上述两部分同时存在。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
int n=scn.nextInt();
for(int i=10000;i<=999999;i++)
{
if(is_especial_palindrome(i,n))
System.out.println(i);
}
}
public static boolean is_especial_palindrome(int i,int n) {
int reverse=0;
int sum=0;
int j=i;
while(i>0)
{
int a=i%10;
reverse=reverse*10+a;
sum+=a;
i=i/10;
}
return reverse==j&&sum==n;
}
}
问题描述
153是一个非常特殊的数,它等于它的每位数字的立方和,即 153 153 153= 13+53+33。编程求所有满足这种条件的三位十进制数。
输出格式
按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。
public class Main {
public static void main(String[] args) {
for (int i = 100; i <=999; i++) {
int temp=i;//跟踪
int a=temp%10;
int b=temp/10%10;
int c=temp/100;
if((int)(Math.pow(a, 3)+Math.pow(b, 3)+Math.pow(c,3))==i)
System.out.println(i);
}
}
}
问题描述
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
输入格式
第一行包含一个整数n。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
import java.util.Scanner;
public class SearchInt {
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
int n=scn.nextInt();
int[] arr=new int[n];
for (int i = 0; i < n; i++) {
arr[i]=scn.nextInt();
}
int key=scn.nextInt();
int count=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]==key)
{
count++;
System.out.println(i+1);
break;
}
}
if(count==0)
System.out.println(-1);
}
}
本来的想法是利用java标准库中的 binarySearch,但是binarySearch使用的前提是输入的数列是从小到达进行排序的。但是如果我们先利用Sort进行排序,那么数列的顺序就被改变了。
问题描述
给出n个数,找出这n个数的最大值,最小值,和。
输入格式
第一行为整数n,表示数的个数。
第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。
输出格式
输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和
样例输入
5
1 3 -2 4 5
样例输出
5
-2
11
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
int n=scn.nextInt();
int[] arr=new int[n];
int sum=0;
for (int i = 0; i < n; i++) {
arr[i]=scn.nextInt();
sum+=arr[i];
}
Arrays.sort(arr);
System.out.println(arr[n-1]);
System.out.println(arr[0]);
System.out.println(sum);
}
}
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
思路:其实就是输出1-31的二进制数。
这里需要注意的是如何将二进制数的输出按照一定的格式输出。
我本来以为String.format(String “”,Object args).
但是搜索了很久都没有找到如何将二进制字符串补零的方法。
不过倒是有将八进制,十进制,十六进制的整数补零的方法。
args为十进制数。
%010x 补0,长度最少10位,x代表转成16进制
%09o 补0,长度最少9位,o表示8进制
d表示十进制。
System.out.println(String.format("%010x", 120000000).toUpperCase());//0007270E00
System.out.println(String.format("%08o", 40));//00000050
System.out.println(String.format("%08d", 40));
public class Main {
public static void main(String[] args) {
for (int i = 0; i <32; i++) {
if(Integer.toBinaryString(i).length()==1)
System.out.println("0000"+Integer.toBinaryString(i));
else if(Integer.toBinaryString(i).length()==2)
System.out.println("000"+Integer.toBinaryString(i));
else if(Integer.toBinaryString(i).length()==3)
System.out.println("00"+Integer.toBinaryString(i));
else if(Integer.toBinaryString(i).length()==4)
System.out.println("0"+Integer.toBinaryString(i));
else
System.out.println(Integer.toBinaryString(i));
}
}
}
问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
思路:
1.首先我们要分解这个图形。
举个例子:我们要打印下列图形
如果我们要打印上述的三角形,我们其实可以分解成两个图形,一个是倒着的(空格)三角形,还有一个正着的
*
等腰三角形。于是我们在一个for里面嵌套两个for循环
for i in range(5):
for j in range(5-i-1):
print(' ',end='')
for j in range(2*i+1):
print('*',end='')
print()
具体可参考这篇文章,可以直接拉到文章末尾。
类似地,我们将字母图形分解为两部分。
输入 5 7 的图
我们打印第一个三角形,再打印第二个三角形。打印第一个三角形时,如果列数足够大,则打印到A,否则打印到只打印列数。
输入 6 2 的图,不能够打印到A
2.分解完之后我们开始打印这个三角形,这个三角形是由字母组成的,我们通过for循环时使用的是数字,因此我们想办法将字母和数字联系起来!对 !就是ASII码。
A的ASII码是65,如果忘了,可以通过下列代码获得。
System.out.println((int)'A');
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
int row=scn.nextInt();
int col=scn.nextInt();
for (int i = 0; i<row; i++) {
//第一个for循环打印左边三角形,需要讨论列数够不够打印到A
for(int j=65+i;j>=Math.max(65, 65+i-col+1);j--)
System.out.print((char)j);
//第二个for循环打印右边三角形
for (int k = 66; k <= 65+col-1-i; k++) {
System.out.print((char)k);
}
//打印完一行需要换行
System.out.println();
}
}
}