蓝桥杯-练习题(1000-1030)

1000.A+B 问题

一、题干

Description
计算 a+b 的值
Input
输入一行,两个整数 a,b (0<=a,b<=10)
Output
 a+b 的运算结果
Sample Input
1 2
Sample Output
3
View Code

二、分析

比较简单
1、接收,空格分割,数据类型转换
View Code

三、代码

package 模拟;

import java.util.Scanner;

public class T1 {

    /**
     * @param args
     */
    public static void main(String[] args) {


        Scanner scanner=new Scanner(System.in);
        
        String aString=scanner.nextLine();
        
        String[] arrStrings=aString.split(" ");
        
        int a=Integer.parseInt(arrStrings[0]);
        
        int b=Integer.parseInt(arrStrings[1]);
        
        System.out.println(a+b);

    }

}
View Code

 

1001.不重复数

一、题干

Description
给定N是一个正整数,求比N大的最小“不重复数”,这里的不重复是指没有两个相等的相邻位,如1102中的11是相等的两个相邻位故不是不重复数,而12301是不重复数。
Input
输入由多组测试数据组成。第一行输入一个整数t,表示测试数据的组数。
接下来的t行,每行输入一个数。
Output
输出有t行,每行依次对应一组测试数据的运算结果。
Sample Input
3
11000000
222222222
333333333
Sample Output
12010101
230101010
340101010
View Code

二、分析

当时觉得比较难,现在感觉还好
1、穷举法
2、判断是否有重复的
3、字符串的截取,charAt();
View Code

三、代码

package 模拟;

import java.util.Scanner;

public class T2 {

    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        
        int conut=scanner.nextInt();
        
        int[] arr=new int[conut];
        
        for (int i = 0; i < arr.length; i++) {
            
            int in=scanner.nextInt();
            arr[i]=getMinNum(in);
            
        }
        
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
            
        }
    }

    //找最小的数
    private static int getMinNum(int in) {
        
        for ( in+=1; ; in++) {
            
            if (getCf(in)) {
                return in;
            }
            
        }
    }

    //判断是否有重复的,转成string比较好判断些
    private static boolean getCf(int in) {
        
        String string=in+"";
        
        for (int i = 0; i < string.length()-1; i++) {
            
            if (string.charAt(i)==string.charAt(i+1)) {
                return false;
            }
            
        }
        
        return true;
    }

}
View Code

 

1002.单位转换

一、题干

Description
在计算机存储里面的单位转换。我们都知道1MB=1024KB,1KB=1024B,1B=8bit,试编程实现单位转换。
Input
输入由多组测试数据组成。首先输入一个整数n,表示测试数据的数目。
接下来的n行,每行表示一个未化简的数据,如xMB,xKB,xB,xbit,(1≤x≤50)
Output
输出为换算过后的数据,ybit
Sample Input
4
1MB
1KB
2B
1bit
Sample Output
8388608bit
8192bit
16bit
1bit
View Code

二、分析

还是很简单的
1、接收一个字符串
2、提取后面的单位,提取数字部分
3、endsWith();的使用,直接判断结尾
View Code

三、代码

package 模拟;

import java.util.Scanner;

public class T3 {

    public static void main(String[] args) {
        
        Scanner scanner=new Scanner(System.in);
        
        int conut=scanner.nextInt();
        
        String[] arr=new String[conut];
        
        for (int i = 0; i < arr.length; i++) {
            
            String in=scanner.next();
            arr[i]=getZh(in);
            
        }
        
        for (int i = 0; i < arr.length; i++) {
            
             System.out.println(arr[i]);
            
        }

    }

    private static String getZh(String nextLine) {
        
        int le=nextLine.length();
        String reString="";
        
        if (nextLine.endsWith("MB")) {

            reString=Integer.parseInt(nextLine.substring(0, le-2))*1024*1024*8 +"bit";
            
        }else if (nextLine.endsWith("KB")) {
            
            reString=Integer.parseInt(nextLine.substring(0, le-2))*1024*8 +"bit";
            
        }else if(nextLine.endsWith("B")){
            
            reString=Integer.parseInt(nextLine.substring(0, le-1))*8 +"bit";
            
        }else if (nextLine.endsWith("bit")) {
            
            reString=nextLine;
            
        }
        return reString;
    }

}
View Code

 

1003.奇偶排序

一、题干

Description
给定一个存放正数的数组,元素个数视输入情况而定,重新排列数组使得数组左边为奇数,右边为偶数,且保证奇数和偶数之间元素相对位置不变。
Input
输入由多组测试数据组成。第一行输入一个整数t,表示测试数据的组数。
输入字符串的格式为:“操作数1 操作数2 … 操作数n”,“操作数”与“操作数”之间以一个空格隔开。
Output
输出有t行,每行依次对应一组测试数据的运算结果。
Sample Input
3
7 32 56 32 1 9
23 11 2 68 98 2 3 68 100
3 5 12 22 1 23 567 876 3 2 56 78
Sample Output
7 1 9 32 56 32
23 11 3 2 68 98 2 68 100
3 5 1 23 567 3 12 22 876 2 56 78
View Code

二、分析

1、接收输入的字符串,转成int型数组
2、前面放奇数,后面放偶数的(相对位置不变)
3、也不难,先把所有的奇数找出来放在前面,在来找偶数的
View Code

三、代码

package 模拟;

import java.io.IOException;
import java.util.Scanner;

public class T4 {

    public static void main(String[] args) throws IOException {

        Scanner scanner=new Scanner(System.in);
        
        String con=scanner.nextLine();
        int conut=Integer.parseInt(con);
        
        //用数组装起来
        String[] arrStrings=new String[conut];
        
        for (int i = 0; i < arrStrings.length; i++) {
            
            //读取一个带空格的字符串
            //PS:用scanner.nextLine有问题、用scanner.next会以空格来结束
            //百度到用bufferedReader.readLine()
            //在自己电脑上测试可以,上传网上测不通过
            
            String inString=scanner.nextLine();
            arrStrings[i]=getArr(inString);
            
        }
        
        //输出
        for (int i = 0; i < arrStrings.length; i++) {
            
            System.out.println(arrStrings[i]);
            
        }

    }

    //奇数放前面,偶数放后面
    private static String getArr(String inString) {
        
        //转成字符串数组
        String[] strArrStrings=inString.split(" ");
        
        String re="";
        
        //奇数
        for (int i = 0; i < strArrStrings.length; i++) {
            
            if (Integer.parseInt(strArrStrings[i])%2==1) {
                re=re+strArrStrings[i]+" ";
            }
            
        }
        //偶数
        for (int i = 0; i < strArrStrings.length; i++) {
            
            if (Integer.parseInt(strArrStrings[i])%2==0) {
                re=re+strArrStrings[i]+" ";
            }
            
        }
        re=re.substring(0, re.length()-1);
        return re;
    }

}
View Code

 

1004.算术运算

一、题干

Description
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“E”。
Input
输入由多组测试数据组成。第一行输入一个整数t,表示测试数据的组数。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
Output
输出有t行,每行依次对应一组测试数据的运算结果。
Sample Input
3
5 + 3
3 – 5
9 ++ 7
Sample Output
8
-2
E
View Code

二、分析

同1001题,无他的

三、代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;


public class T4 {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        
        Scanner scanner=new Scanner(System.in);
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        
        int conut=scanner.nextInt();
        
        String[] arrString=new String[conut];
        
        for (int i = 0; i < arrString.length; i++) {
            
            arrString[i]=bufferedReader.readLine();
            
        }
        
        for (int i = 0; i < arrString.length; i++) {
            System.out.println(getNum(arrString[i]));
            
        }
        
    }
    public static String getNum(String s) {
        String sArrString[]=s.split(" ");
        
        String ret="E";
        try {
            if (sArrString[1].equals("+")) {
                ret=Integer.parseInt(sArrString[0])+Integer.parseInt(sArrString[2])+"";
            }
            if (sArrString[1].equals("-")) {
                ret=Integer.parseInt(sArrString[0])-Integer.parseInt(sArrString[2])+"";
            }
        } catch (Exception e) {

        }
        return ret;
    } 
}
View Code

 

1005.奇偶排序

一、题干

Description
将10000块钱兑换成由5000块、2000块、1000块、500块、100块、50块、10块、5块、1块的组成的零钱,问有多少种兑换方式?
Input
无输入
Output
运算结果。

样例输出中的结果不正确,只是格式提示

Sample Input
无输入
Sample Output
13456789
View Code

二、分析

    /**
     * 将10000块钱兑换成由5000块、2000块、1000块、500块、100块、50块、10块、5块、1块的组成的零钱,问有多少种兑换方式?
     * 
     * 参考来自:http://www.cnblogs.com/lekko/archive/2013/04/05/3000403.html
     * 
     * 一般的都是写八九层循环做的,
     * 优化:
     *     1、循环次数的控制(动态的控制,根据上层循环得结果来决定下层循环的次数)
     *     2、每层计算循环的结果:sum[],省的每次都要重新计算一次
     *     3、最后一层,到5和1的时候,直接(10000-sum[6])/5就可得到5的次数,1不用考虑
     */
View Code

三、代码

(答案:24597373438)

package 模拟;

public class T6 {

    /**
     * 将10000块钱兑换成由5000块、2000块、1000块、500块、
     * 100块、50块、10块、5块、1块的组成的零钱,问有多少种兑换方式?
     */
    public static void main(String[] args) {
        
        //9种面额的钱
        int[] money=new int[]{5000,2000,1000,500,100,50,10,5,1};
        
        //没个循环后的钱数
        int[] sum=new int[9]; 
        
        //下层循环的次数
        int[] conut=new int[9];
        
        long re=0;
        //5000
        for (int i = 0; i < 3; i++) {
            sum[0]=i*money[0];
            conut[1]=(10000-sum[0])/money[1]+1;

            //2000
            for (int j = 0; j < conut[1]; j++) {
                sum[1]=j*money[1]+sum[0];
                conut[2]=(10000-sum[1])/money[2]+1;

                //1000
                for (int k = 0; k < conut[2]; k++) {
                    sum[2]=k*money[2]+sum[1];
                    conut[3]=(10000-sum[2])/money[3]+1;
                    
                    //500
                    for (int k2 = 0; k2 < conut[3]; k2++) {
                        sum[3]=k2*money[3]+sum[2];
                        conut[4]=(10000-sum[3])/money[4]+1;

                        //100
                        for (int l = 0; l < conut[4]; l++) {
                            sum[4]=l*money[4]+sum[3];
                            conut[5]=(10000-sum[4])/money[5]+1;

                            //50
                            for (int l2 = 0; l2 < conut[5]; l2++) {
                                sum[5]=l2*money[5]+sum[4];
                                conut[6]=(10000-sum[5])/money[6]+1;
                                
                                //10
                                for (int m = 0; m < conut[6]; m++) {
                                    sum[6]=m*money[6]+sum[5];
                                    conut[7]=(10000-sum[6])/money[7]+1;
                                    
                                    re+=conut[7];
                                }
                            }
                        }
                    }
                }
            }
        }
        System.out.println(re);
    }
}
View Code

 

1006.分解质因数

一、题干

Description
将一个正整数N分解质因数,比如150=2*3*5*5,其质因数为2 3 5 5。
Input
输入由多组测试数据组成。第一行输入一个整数t,表示测试数据的组数。
接下来的t行,每行输入一个正整数。
Output
输出有t行,每行依次对应一组测试数据的输出结果。
Sample Input
2
90
150
Sample Output
2 3 3 5
2 3 5 5 
View Code

二、分析

1、分解质因数,从2开始除,除不断时,找大一点的再除,直至余数为零
2、找更大的一个质因数
3、只能被自己和1整除的数为质因数
View Code

三、代码

package 模拟;

import java.util.Scanner;

public class T7 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        Scanner scanner=new Scanner(System.in);
        int conut=Integer.parseInt(scanner.nextLine());
        
        String[] arrString=new String[conut];
        
        for (int i = 0; i < arrString.length; i++) {
             
            arrString[i]=getZY(scanner.nextLine());
            
        }
        for (int i = 0; i < arrString.length; i++) {
            System.out.println(arrString[i]);
            
        }
        
    }
    
    //分解质因数,从2开始除,除不断时,找大一点的再除,直至余数为零
    private static String getZY(String nextLine) {
        
        int num=Integer.parseInt(nextLine);
        
        int zhi=2;
        
        String reString="";
        
        for ( ;1!=num ; ) {
            if (num%zhi==0) {
                reString=reString+zhi+" ";
                num/=zhi;
            }else {
                zhi=getZHI(zhi);
            }
            
        }
        
        return reString;
    }
    
    //找更大的一个质因数
    private static int getZHI(int zhi) {
        
        for (int i = zhi+1; ; i++) {
            
            for (int j = 2; j < zhi+1/2+1; j++) {
                
                if (i%j==0) {
                    break;
                }
                
            }
            return i;
        }
    }

}
View Code

 

1007.回文素数

一、题干

Description
回文素数是指,如果一个正整数n从左向右和从右向左读结果都相同且是素数,则称之为回文素数。编程找出1000以内的回文素数
Input
无输入
Output
输出有若干行,每行输出5个回文素数。(样例输出只是格式提示)
Sample Input
无输入
Sample Output
2 3 5 7 11 
101 131 151 181 191 
View Code

二、分析

1、先判断是否为素数
2、再判断是否为回文数
View Code

三、代码

package 模拟;

public class T8 {

    /**
     * 回文素数是指,如果一个正整数n从左向右和从右向左读结果都相同且是素数,
     * 则称之为回文素数。编程找出1000以内的回文素数
     */
    public static void main(String[] args) {
        int co=0;
        
        //判断素数
        for (int i = 2; i < 1000; i++) {
            boolean fa=true;
            for (int j = 2; j < i/2+1; j++) {
                
                if (i%j==0) {
                    fa=false;
                    break;
                }else{
                    fa=true;
                }
            }
            //是素数的再看是不是回文数
            if (fa) {
                if (getHui(i)) {
                    co++;
                    System.out.print(i+" ");
                    if (co==5) {
                        System.out.println();
                        co=0;
                    }
                }
            }
        }
    }

    //判断是否为回文数
    private static boolean getHui(int i) {
        
        String aString=i+"";
        int le=aString.length();
        if (le==1) {
            return true;
        }else if (le==2) {
            if (aString.charAt(0)==aString.charAt(1)) {
                return true;
            }
        }else if (le==3) {
            if (aString.charAt(0)==aString.charAt(2)) {
                return true;
            }
        }
        return false;
    }

}
View Code

 

posted @ 2016-11-06 10:50  占位符,😐!  阅读(573)  评论(0编辑  收藏  举报