天天看点

蓝桥杯刷题基础java--进制转换和循环

一、进制转换

注意看输入的数的范围是不是在int里和输出的数是否在int类型里。int的取值范围为(-2147483648~2147483647),占用4个字节(-231 到 231-1)

,如果在范围内,则可以使用标准库。

  • 十进制转为其他进制:

    输入的数的范围要在int里

十进制转成十六进制:  
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)  
使用第二个参数指定的基数,将==字符串参数==解析为有符号的整数。
————————————————

           
练习1:将十进制转化成十六进制

给出一个非负整数,将它表示成十六进制的形式。

输入格式

  输入包含一个非负整数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());	
	}
}

           
练习2:将十六进制转化成十进制

问题描述

  从键盘输入一个不超过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:十六进制转化为八进制

练习3:十六进制转化为八进制

二、循环

练习1:回文数

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;	
	}
}

           

练习2:特殊回文数

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;	
	}
}
           

练习3:水仙花数

问题描述

  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);
		}

	}

}
           

练习4:查找整数

问题描述

给出一个包含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进行排序,那么数列的顺序就被改变了。

练习5:求最大值最小值和

问题描述

给出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);
	}
}

           

练习6:01子串

问题描述

对于长度为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));
		}
	}
}
           

练习7:字母图形

问题描述

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入格式

输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。

输出格式

输出n行,每个m个字符,为你的图形。

思路:

1.首先我们要分解这个图形。

举个例子:我们要打印下列图形

蓝桥杯刷题基础java--进制转换和循环

如果我们要打印上述的三角形,我们其实可以分解成两个图形,一个是倒着的

(空格)三角形,还有一个正着的

*

等腰三角形。于是我们在一个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 的图

蓝桥杯刷题基础java--进制转换和循环

我们打印第一个三角形,再打印第二个三角形。打印第一个三角形时,如果列数足够大,则打印到A,否则打印到只打印列数。

输入 6 2 的图,不能够打印到A

蓝桥杯刷题基础java--进制转换和循环

2.分解完之后我们开始打印这个三角形,这个三角形是由字母组成的,我们通过for循环时使用的是数字,因此我们想办法将字母和数字联系起来!对 !就是ASII码。

A的ASII码是65,如果忘了,可以通过下列代码获得。

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();
		}		
	}
}