藍橋杯的基礎練習,別處的答案有的寫得很冗餘,沒有充分利用java簡潔的方法,在這裏有我自己整合寫的代碼,僅提供java實現,如有問題,歡迎探討。
藍橋杯 基礎練習02 Java實現
已解決進制轉換問題
1.閏年判斷
/*
基礎練習 閏年判斷
問題描述
給定一個年份,判斷這一年是不是閏年。
當以下情況之一滿足時,這一年是閏年:
1. 年份是4的倍數而不是100的倍數;
2. 年份是400的倍數。
其他的年份都不是閏年。
輸入格式
輸入包含一個整數y,表示當前的年份。
輸出格式
輸出一行,如果給定的年份是閏年,則輸出yes,否則輸出no。
說明:當試題指定你輸出一個字符串作爲結果(比如本題的yes或者no,你需要嚴格按照試題中給定的大小寫,寫錯大小寫將不得分。
樣例輸入
2013
樣例輸出
no
樣例輸入
2016
樣例輸出
yes
數據規模與約定
1990 <= y <= 2050。
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int y;
Scanner s=new Scanner(System.in);
y=s.nextInt();
if(y>=1990 &&y <= 2050){
if(y%4==0&&y%100!=0||y%400==0){
System.out.println("yes");
}
else{
System.out.println("no");
}
}else{
System.out.println("no");
}
}
}
2.01字串
注:
1.System.out流有提供printf方法,與C語言一樣可以使用%d來控制輸出格式
2.Integer.toBinaryString()方法是將傳參轉換成二進制,返回字符串
3.Integer.parseInt()方法將傳入字符串封裝成Interger
此處只是打印5個字符,實際上我採用的方法是將二進制數轉化成其字面值表示的十進制數存入int變量,通過printf格式輸出補足前面的0。
/*
基礎練習 01字串
問題描述
對於長度爲5位的一個01串,每一位都可能是0或1,一共有32種可能。它們的前幾個是:
00000
00001
00010
00011
00100
請按從小到大的順序輸出這32種01串。
輸入格式
本試題沒有輸入。
輸出格式
輸出32行,按從小到大的順序每行一個長度爲5的01串。
樣例輸出
00000
00001
00010
00011
<以下部分省略>
*/
public class Main {
public static void main(String[] args) {
for(int i=0;i<32;i++){
int c=Integer.parseInt(Integer.toBinaryString(i));
System.out.printf("%05d\n",c);
}
}
}
3.字母圖形
/*
基礎練習 字母圖形
問題描述
利用字母可以組成一些美麗的圖形,下面給出了一個例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
這是一個5行7列的圖形,請找出這個圖形的規律,並輸出一個n行m列的圖形。
輸入格式
輸入一行,包含兩個整數n和m,分別表示你要輸出的圖形的行數的列數。
輸出格式
輸出n行,每個m個字符,爲你的圖形。
樣例輸入
5 7
樣例輸出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
數據規模與約定
1 <= n, m <= 26。
*/
import java.util.Scanner;
public class Main {
static char []a=new char[26];
static int m;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n= sc.nextInt();
m=sc.nextInt();
for(int i=0;i<26;i++){
a[i]=(char)('A'+i);
}
for(int i=0;i<n;i++){
print(i);
}
}
public static void print(int i){
int t;
for(t=1;i>=0&t<=m;i--,t++){
System.out.print(a[i]);
}
for(int j=1;j<m&j<=m-t+1;j++){
System.out.print(a[j]);
}
System.out.println();
}
}
4.數列特徵
/*
基礎練習 數列特徵
問題描述
給出n個數,找出這n個數的最大值,最小值,和。
輸入格式
第一行爲整數n,表示數的個數。
第二行有n個數,爲給定的n個數,每個數的絕對值都小於10000。
輸出格式
輸出三行,每行一個整數。第一行表示這些數中的最大值,第二行表示這些數中的最小值,第三行表示這些數的和。
樣例輸入
5
1 3 -2 4 5
樣例輸出
5
-2
11
數據規模與約定
1 <= n <= 10000。
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n= sc.nextInt();
int [] a=new int[n];
a[0]=sc.nextInt();
int max=a[0];
int min=a[0];
int sum=a[0];
for(int i=1;i<n;i++){
a[i]=sc.nextInt();
sum+=a[i];
if(max<a[i]){
max=a[i];
}
if(min>a[i]){
min=a[i];
}
}
sc.close();
System.out.println(max);
System.out.println(min);
System.out.println(sum);
}
}
5.查找整數
/*
基礎練習 查找整數
問題描述
給出一個包含n個整數的數列,問整數a在數列中的第一次出現是第幾個。
輸入格式
第一行包含一個整數n。
第二行包含n個非負整數,爲給定的數列,數列中的每個數都不大於10000。
第三行包含一個整數a,爲待查找的數。
輸出格式
如果a在數列中出現了,輸出它第一次出現的位置(位置從1開始編號),否則輸出-1。
樣例輸入
6
1 9 4 8 3 9
9
樣例輸出
2
數據規模與約定
1 <= n <= 1000。
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n= sc.nextInt();
int [] a=new int[n];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
int find=sc.nextInt();
int location=-1;
sc.close();
for(int i =0;i<n;i++){
if(a[i]==find){
location=i+1;
break;
}
}
System.out.println(location);
}
}
6.楊輝三角形
/*
基礎練習 楊輝三角形
問題描述
楊輝三角形又稱Pascal三角形,它的第i+1行是(a+b)i的展開式的係數。
它的一個重要性質是:三角形中的每個數字等於它兩肩上的數字相加。
下面給出了楊輝三角形的前4行:
1
1 1
1 2 1
1 3 3 1
給出n,輸出它的前n行。
輸入格式
輸入包含一個數n。
輸出格式
輸出楊輝三角形的前n行。每一行從這一行的第一個數開始依次輸出,中間使用一個空格分隔。請不要在前面輸出多餘的空格。
樣例輸入
4
樣例輸出
1
1 1
1 2 1
1 3 3 1
數據規模與約定
1 <= n <= 34。
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n= sc.nextInt();
int [][] a=new int[n][n];
for(int i=0;i<n;i++){
a[i][i]=1;
a[i][0]=1;
}
for(int i=2;i<n;i++){
for(int j=1;j<i;j++){
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}
7.
/*
基礎練習 特殊的數字
問題描述
153是一個非常特殊的數,它等於它的每位數字的立方和,即153=1*1*1+5*5*5+3*3*3。編程求所有滿足這種條件的三位十進制數。
輸出格式
按從小到大的順序輸出滿足條件的三位十進制數,每個數佔一行。
*/
public class Main {
public static void main(String[] args) {
int a,b,c;
for(a=1;a<=9;a++){
for(b=0;b<=9;b++){
for(c=0;c<=9;c++){
if(a*100+b*10+c==a*a*a+b*b*b+c*c*c){
System.out.println(a+""+b+""+c);
}
}
}
}
}
}
8.
/*
基礎練習 迴文數
問題描述
1221是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的,編程求所有這樣的四位十進制數。
輸出格式
按從小到大的順序輸出滿足條件的四位十進制數。
*/
public class Main {
public static void main(String[] args) {
int a,b;
for(a=1;a<=9;a++){
for(b=0;b<=9;b++){
System.out.println(a+""+b+""+b+""+a);
}
}
}
}
9.
/*
基礎練習 特殊迴文數
問題描述
123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。
輸入一個正整數n, 編程求所有這樣的五位和六位十進制數,滿足各位數字之和等於n 。
輸入格式
輸入一行,包含一個正整數n。
輸出格式
按從小到大的順序輸出滿足條件的整數,每個整數佔一行。
樣例輸入
52
樣例輸出
899998
989989
998899
數據規模和約定
1<=n<=54。
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
if(n>54){
System.exit(0);
}
sc.close();
int a,b,c;
for(a=1;a<=9;a++){
for(b=0;b<=9;b++){
for(c=0;c<=9;c++){
if(2*(a+b)+c==n){
System.out.println(a+""+b+""+c+""+b+""+a);
}
}
}
}
for(a=1;a<=9;a++){
for(b=0;b<=9;b++){
for(c=0;c<=9;c++){
if(2*(a+b+c)==n){
System.out.println(a+""+b+""+c+""+c+""+b+""+a);
}
}
}
}
}
}
- 十進制轉十六進制
tip:藍橋系統的匹配文件是大寫字母,而調用自動裝箱的方法輸出的16進制是小寫字母,toUpperCase方法是轉換成大寫字母的。
/*
基礎練習 十進制轉十六進制
問題描述
十六進制數是在程序設計時經常要使用到的一種整數的表示方式。它有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。
給出一個非負整數,將它表示成十六進制的形式。
輸入格式
輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647
輸出格式
輸出這個整數的16進製表示
樣例輸入
30
樣例輸出
1E
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(Integer.toHexString(n).toUpperCase());
}
}
- 十六進制轉十進制
tip:其中系統的一個檢測文件轉化成int會溢出,所以使用Long
/*
基礎練習 十六進制轉十進制
問題描述
從鍵盤輸入一個不超過8位的正的十六進制數字符串,將它轉換爲正的十進制數後輸出。
注:十六進制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。
樣例輸入
FFFF
樣例輸出
65535
*/
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
System.out.println(Long.parseLong(s,16));
}
}
- 十六進制轉八進制
tips:關於此題使用包裝類方法錯誤的原因:關於Integer.parseInt()方法的問題
此代碼來源爲百度
/*
基礎練習 十六進制轉八進制
問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行爲一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
輸出n行,每行爲輸入對應的八進制正整數。
注意
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
提示
先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String[] st=new String[n];
for(int i=0;i<n;i++)
{
st[i] =sc.next();
}
sc.close();
for(int i=0;i<n;i++)
{
String str1=ttos(st[i]);
int len_str1=str1.length();
if(len_str1%3==1)str1="00"+str1;
else if(len_str1%3==2)str1="0"+str1;
ttoe(str1);
System.out.println();
}
}
public static String ttos(String str)
{
int len_str=str.length();
StringBuilder str2=new StringBuilder();
for(int i=0;i<len_str;++i)
{
switch(str.charAt(i))
{
case '0':str2.append("0000");break;
case '1':str2.append("0001");break;
case '2':str2.append("0010");break;
case '3':str2.append("0011");break;
case '4':str2.append("0100");break;
case '5':str2.append("0101");break;
case '6':str2.append("0110");break;
case '7':str2.append("0111");break;
case '8':str2.append("1000");break;
case '9':str2.append("1001");break;
case 'A':str2.append("1010");break;
case 'B':str2.append("1011");break;
case 'C':str2.append("1100");break;
case 'D':str2.append("1101");break;
case 'E':str2.append("1110");break;
case 'F':str2.append("1111");break;
default:break;
}
} return str2.toString();
}
public static void ttoe(String str2)
{
int len=str2.length();
int a;
a=(str2.charAt(0)-'0')*4+(str2.charAt(1)-'0')*2+(str2.charAt(2)-'0');
if(a!=0)System.out.print(a);
for(int i=3;i<=len-2;i+=3)
{
a=(str2.charAt(i)-'0')*4+(str2.charAt(i+1)-'0')*2+(str2.charAt(i+2)-'0');
System.out.print(a);
}
}
}
- 數列排序
/*
基礎練習 數列排序
問題描述
給定一個長度爲n的數列,將這個數列按從小到大的順序排列。1<=n<=200
輸入格式
第一行爲一個整數n。
第二行包含n個整數,爲待排序的數,每個整數的絕對值小於10000。
輸出格式
輸出一行,按從小到大的順序輸出排序後的數列。
樣例輸入
5
8 3 6 4 9
樣例輸出
3 4 6 8 9
*/
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n= sc.nextInt();
int [] a=new int[n];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
Arrays.sort(a);
for(int b:a){
System.out.print(b+" ");
}
}
}