2017蓝桥杯模拟赛

    xiaoxiao2021-03-25  9

    1、标题:算年龄

    英国数学家德摩根出生于19世纪初叶(即18xx年)。 他年少时便很有才华。一次有人问他的年龄,他回答说: “到了x的平方那年,我刚好是x岁”。 请你计算一下,德摩根到底出生在哪一年。 题中的年龄指的是周岁。

    请填写表示他出生年份的四位数字,不要填写任何多余内容。

    代码:

    [java]  view plain  copy       public class T1 {          public static void main(String[] args) {                      for (int i = 1; i < 100; i++) {               if(i*i/100==18){                   System.out.println(i*i-i);               }           }       }   }  

    2、题目:猜算式

    你一定还记得小学学习过的乘法计算过程,比如:    179 x  224 ------    716  358 358 ------ 40096   请你观察如下的乘法算式     *** x   *** --------     ***    ***   *** --------   *****    星号代表某位数字,注意这些星号中, 0~9中的每个数字都恰好用了2次。 (如因字体而产生对齐问题,请参看图p1.jpg) 请写出这个式子最终计算的结果,就是那个5位数是多少? 注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。 代码:

    [java]  view plain  copy       import java.util.Arrays;      public class T2 {          public static void main(String[] args) {                      String s="";           for (int i = 10; i < 1000; i++) {               for (int a = 0; a < 10; a++) {                   for (int b = 0; b < 10; b++) {                       for (int c = 0; c < 10; c++) {                                                      //if(i*a>=1000||i*a<100||i*b>=1000||i*b<100||i*b>=1000||i*b<100) continue;                                                      int num=i*(a*100+b*10+c);                                                      if(num>=10000&&num<100000){                               s=""+i+a+b+c+i*a+i*b+i*c+num;                                                              if(s.length()==20&&check(s)){                                   System.out.println(num);                                   //System.out.println(s);                               }                           }                       }                   }               }           }       }          private static boolean check(String s) {                      char[] ch=s.toCharArray();                      Arrays.sort(ch);                      if("00112233445566778899".equals(new String(ch)))               return true;           else               return false;       }   }  

    3、标题: 排列序数

    X星系的某次考古活动发现了史前智能痕迹。 这是一些用来计数的符号,经过分析它的计数规律如下: (为了表示方便,我们把这些奇怪的符号用a~q代替) abcdefghijklmnopq 表示0 abcdefghijklmnoqp 表示1 abcdefghijklmnpoq 表示2 abcdefghijklmnpqo 表示3 abcdefghijklmnqop 表示4 abcdefghijklmnqpo 表示5 abcdefghijklmonpq 表示6 abcdefghijklmonqp 表示7 ..... 在一处石头上刻的符号是: bckfqlajhemgiodnp 请你计算出它表示的数字是多少? 请提交该整数,不要填写任何多余的内容,比如说明或注释。

    代码:

    [java]  view plain  copy       public class T3 {          public static void main(String[] args) {                      //abcdefghijklmnopq                       String s="bckfqlajhemgiodnp";//bckfqlajhemgiodnp           System.out.println(s);           int[] arr = quanzhi(s);           long sum=0;           for (int i = arr.length-1,k=0; i >=0; i--,k++) {               sum+=arr[i]*jiecheng(k);           }           System.out.println(sum);       }              private static int[] quanzhi(String s) {           int[] arr=new int[s.length()];                      for (int i = 0; i < arr.length; i++) {               int q=0;               for (int j = i+1; j < arr.length; j++) {                   if(s.charAt(i)-s.charAt(j)>0){                       q++;                   }               }               arr[i]=q;           }                      return arr;       }          private static long jiecheng(long l) {           if(l==0||l==1){               return 1;           }           long j=1;           for (int i = 1; i <=l; i++) {               j=j*i;           }           return j;       }   }  

    4、标题:字符串比较

    我们需要一个新的字符串比较函数compare(s1, s2). 对这个函数要求是: 1. 它返回一个整数,表示比较的结果。 2. 结果为正值,则前一个串大,为负值,后一个串大,否则,相同。 3. 结果的绝对值表示:在第几个字母处发现了两个串不等。 下面是代码实现。对题面的数据,结果为: -3 2 5 仔细阅读源程序,填写划线位置缺少的代码。 ------------------------------------------------- Java语言代码: static int compare(String s1, String s2) { if(s1==null && s2==null) return 0; if(s1==null) return -1; if(s2==null) return 1; if(s1.isEmpty() && s2.isEmpty()) return 0; if(s1.isEmpty()) return -1; if(s2.isEmpty()) return 1; char x = s1.charAt(0); char y = s2.charAt(0); if(x<y) return -1; if(x>y) return 1; int t = compare(s1.substring(1),s2.substring(1)); if(t==0) return 0; return ____________________ ; //填空位置 } public static void main(String[] args) { System.out.println(compare("abc", "abk")); System.out.println(compare("abc", "a")); System.out.println(compare("abcde", "abcda")); } 注意: 只提交划线部分缺少的代码,不要包含已经存在的代码或符号。 也不要画蛇添足地写出任何注释或说明性文字。 注意选择你所使用的语言。 [java]  view plain  copy       public class T4 {       static int compare(String s1, String s2)       {           if(s1==null && s2==nullreturn 0;           if(s1==nullreturn -1;           if(s2==nullreturn 1;                      if(s1.isEmpty() && s2.isEmpty()) return 0;           if(s1.isEmpty()) return -1;           if(s2.isEmpty()) return 1;                      char x = s1.charAt(0);           char y = s2.charAt(0);                      if(x<y) return -1;           if(x>y) return 1;                      int t = compare(s1.substring(1),s2.substring(1));           if(t==0return 0;                      return t>0?(1+(t>0?t++:t--)):(-1+(t>0?t--:t++)); //填空位置//1+(t==0?(t++):(t--))       }          public static void main(String[] args)       {           System.out.println(compare("abc""abk"));           System.out.println(compare("abc""a"));           System.out.println(compare("abcde""abcda"));                     }   }  

    5、标题: 还款计算

    银行贷款的等额本息还款方法是: 每月还固定的金额,在约定的期数内正好还完(最后一个月可能会有微小的零头出入)。 比如说小明在银行贷款1万元。贷款年化利率为5%,贷款期限为24个月。 则银行会在每个月进行结算: 结算方法是:计算本金在本月产生的利息: 本金 x (年利率/12) 则本月本金结余为:本金 + 利息 - 每月固定还款额 计算结果会四舍五入到“分”。 经计算,此种情况下,固定还款额应为:438.71 这样,第一月结算时的本金余额是: 9602.96 第二个月结算: 9204.26 第三个月结算: 8803.9 .... 最后一个月如果仍按固定额还款,则最后仍有0.11元的本金余额, 但如果调整固定还款额为438.72, 则最后一个月会多还了银行0.14元。 银行会选择最后本金结算绝对值最小的情况来设定 每月的固定还款额度。 如果有两种情况最后本金绝对值相同,则选择还款较少的那个方案。 本题的任务是已知年化利率,还款期数,求每月的固定还款额度。 假设小明贷款为1万元,即:初始本金=1万元。 年化利率的单位是百分之多少。 期数的单位为多少个月。 输入为2行, 第一行为一个小数r,表示年率是百分之几。(0<r<30) 第二行为一个整数n,表示还款期限。 (6<=n<=120) 要求输出为一个整数,表示每月还款额(单位是:分) 例如: 输入: 4.01 24 程序应该输出: 43429 再比如: 输入: 6.85 36 程序应该输出: 30809 代码:

    [java]  view plain  copy       import java.util.Scanner;   import java.math.BigDecimal;      public class T5 {          public static void main(String[] args) {                      Scanner sc=new Scanner(System.in);           double lv=sc.nextDouble()/100;           double m=sc.nextDouble();                      double ed=0,sy=100;           double x=10000/m;//怎么确定一个大概的范围??           for (double k = x; k < x+50; k+=0.01) {                              double d=10000;                              BigDecimal kk=BigDecimal.valueOf(k);               k=kk.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();                              for (int i = 1; i <= m; i++) {                   BigDecimal bd=BigDecimal.valueOf(d+d*(lv/12)-k);                   d=bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();               }               if(Math.abs(sy-d)<sy){                   ed=k;                   sy=d;                   //System.out.println(k+": "+d);               }           }              System.out.println((int)(ed*100));       }   }  

    6、题目:滑动解锁

    滑动解锁是智能手机一项常用的功能。你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点。这些划过的点所组成的有向折线,如果与预设的折线在图案、方向上都一致,那么手机将解锁。 所谓两个点“相邻”:当且仅当以这两个点为端点的线段上不存在尚未经过的点。 此外,许多手机都约定:这条折线还需要至少经过4个点。 为了描述方便,我们给这9个点从上到下、从左到右依次编号1-9。即如下排列: 1 2 3 4 5 6 7 8 9 那么1->2->3是非法的,因为长度不足。 1->3->2->4也是非法的,因为1->3穿过了尚未经过的点2。 2->4->1->3->6是合法的,因为1->3时点2已经被划过了。 某大神已经算出:一共有389112种不同的解锁方案。没有任何线索时,要想暴力解锁确实很难。 不过小Hi很好奇,他希望知道,当已经瞥视到一部分折线的情况下,有多少种不同的方案。 遗憾的是,小Hi看到的部分折线既不一定是连续的,也不知道方向。 例如看到1-2-3和4-5-6, 那么1->2->3->4->5->6,1->2->3->6->5->4, 3->2->1->6->5->4->8->9等都是可能的方案。 你的任务是编写程序,根据已经瞥到的零碎线段,求可能解锁方案的数目。 输入: 每个测试数据第一行是一个整数N(0 <= N <= 8),代表小Hi看到的折线段数目。 以下N行每行包含两个整数 X 和 Y (1 <= X, Y <= 9),代表小Hi看到点X和点Y是直接相连的。 输出: 对于每组数据输出合法的解锁方案数目。 例如: 输入: 8 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 程序应该输出: 2 再例如: 输入: 4 2 4 2 5 8 5 8 6 程序应该输出: 258 资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗  < 1000ms

    代码:

    [java]  view plain  copy     import java.util.Scanner;      public class T6 {          static int[][] filter=new int[10][10];      //不可能出现的情况       static boolean[][] know=new boolean[10][10];//标记已知线段       static int[] stamp=new int[9];              //存放搜索出来的点       static boolean[] vis=new boolean[10];       //已经用过的点       static int n,result;                        //n:已知线段数目,result可能出现的情况              public static void main(String[] args) {                      Scanner sc=new Scanner(System.in);                      //接收已知线段           //n=sc.nextInt();   //      for (int i = 0; i < n; i++) {   //          int a=sc.nextInt();   //          int b=sc.nextInt();   //          know[a][b]=know[b][a]=true;   //      }                      //不可能的情况           filter[1][3]=filter[3][1]=2;             filter[4][6]=filter[6][4]=5;             filter[7][9]=filter[9][7]=8;             filter[1][7]=filter[7][1]=4;             filter[2][8]=filter[8][2]=5;             filter[3][9]=filter[9][3]=6;             filter[1][9]=filter[9][1]=5;             filter[3][7]=filter[7][3]=5;                        vis[0]=true;           dfs(0);                       System.out.println(result);       }       private static void dfs(int count) {              if(count>=4)             {                 int nKnow=0;                 for(int i=1;i<count;i++)                 {                     if(know[stamp[i]][stamp[i-1]])  //                       nKnow++;                 }                                result++;//测试总共有多少种情况                              if(n==nKnow){                   //result++;//有已知线段的情况                   for (int i = 0; i < count; i++) {                       System.out.print(stamp[i]);                   }                   System.out.println();               }           }                      for(int i=1;i<=9;i++)             {                 if(count>0&&!vis[filter[stamp[count-1]][i]])                 continue;                 if(!vis[i])                 {                     vis[i]=true;                     stamp[count]=i;                    dfs(count+1);                     vis[i]=false;                 }             }            return ;         }   }  

    7、标题:风险度量

    X星系的的防卫体系包含 n 个空间站。这 n 个空间站间有 m 条通信链路,构成通信网。 两个空间站间可能直接通信,也可能通过其它空间站中转。 对于两个站点x和y (x != y), 如果能找到一个站点z,使得: 当z被破坏后,x和y无法通信,则称z为关于x,y的关键站点。 显然,对于给定的两个站点,关于它们的关键点的个数越多,通信风险越大。 你的任务是:已知网络结构,求两站点之间的通信风险度,即:它们之间的关键点的个数。 输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,链路数。 空间站的编号从1到n。通信链路用其两端的站点编号表示。 接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条链路。 最后1行,两个数u,v,代表被询问通信风险度的两个站点。 输出:一个整数,如果询问的两点不连通则输出-1. 例如: 用户输入: 7 6 1 3 2 3 3 4 3 5 4 5 5 6 1 6 则程序应该输出: 2 资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗  < 2000ms

    代码:

    [java]  view plain  copy     import java.util.Scanner;      public class T7 {          static boolean[][] data;       static boolean[] vis;       static boolean fal=false;              public static void main(String[] args) {                      Scanner sc=new Scanner(System.in);                      int n=sc.nextInt();           int m=sc.nextInt();                      data=new boolean[n+1][n+1];           int[] arr=new int[n+1];           vis=new boolean[n+1];                      for (int i = 1; i < arr.length; i++) {               arr[i]=i;           }                      //标记走得通得路线           for (int i = 0; i < m; i++) {               int a=sc.nextInt();               int b=sc.nextInt();               data[a][b]=data[b][a]=true;           }                      int begin=sc.nextInt();           int end=sc.nextInt();           sc.close();                      //先看从begin到end走得通吗           vis[0]=true;           dfs(begin,end,0);           if(!fal){               System.out.println("-1");               return;           }           //System.out.println("OK");                      //走得通,遍历去除每一个点           int count=0;           for (int i = 1; i < arr.length; i++) {               if(arr[i]!=begin&&arr[i]!=end)               fal=false;               dfs(begin,end,arr[i]);               if(fal==false)                   count++;           }                      System.out.println(count);       }          private static void dfs(int begin, int end, int i) {                      //System.out.println(begin+" "+end+" "+data[begin][end]);           if(data[begin][end]==true){               fal=true;               return;           }              for (int j = 1; j < data.length; j++) {               if(j!=i&&!vis[begin]&&data[begin][j]==true){                   vis[begin]=true;                   dfs(j,end,i);                   vis[begin]=false;               }           }           return;       }   }  
    转载请注明原文地址: https://ju.6miu.com/read-200331.html

    最新回复(0)