Java 测试1

1.明明的随机数

描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入有2行,第1行为1个正整数,表示所生成的随机数的个数:N;
第2行有N个用空格隔开的正整数,为所产生的随机数。输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。样例输入

10
20 40 32 67 40 20 89 300 400 15

样例输出

8
15 20 32 40 67 89 300 400

很经典的题,去重排序用set即可


 

import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public  class Main{
    public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        while (cin.hasNext()){
          int n = cin.nextInt();
          Set<Integer> teSet=new TreeSet<Integer>();
          for (int i =0;i<n;i++){
              teSet.add(cin.nextInt());   
          }
          System.out.println(teSet.size());
          for(Integer i:teSet) {
            System.out.print(i+" ");
          }
        }
    }
}

 

 

2:合影效果

描述

小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都不同)?

输入第一行是人数n(2 <= n <= 40,且至少有1个男生和1个女生)。
后面紧跟n行,每行输入一个人的性别(男male或女female)和身高(浮点数,单位米),两个数据之间以空格分隔。输出n个浮点数,模拟站好队后,拍照者眼中从左到右每个人的身高。每个浮点数需保留到小数点后2位,相邻两个数之间用单个空格隔开。样例输入

6
male 1.72
male 1.78
female 1.61
male 1.65
female 1.70
female 1.56

样例输出

1.65 1.72 1.78 1.70 1.61 1.56

先升序再降序,其实是对两个数组进行两种排序(升序、降序),但是因为刚写完第三题,就直接在set的基础上写了。注意构造逆序set的方法:

 girlsSet = ((TreeSet<Double>) girlsSet).descendingSet()

我的代码:

  1. import java.util.Scanner;
  2. import java.util.Set;
  3. import java.util.TreeSet;
  4. public  class Main{
  5.     public static void main(String[] args){
  6.         Scanner cin = new Scanner(System.in);
  7.         while (cin.hasNext()){
  8.           int n = cin.nextInt();
  9.           Set<Double> boySet=new TreeSet<Double>();
  10.           Set<Double> girlsSet=new TreeSet<Double>();
  11.           girlsSet = ((TreeSet<Double>) girlsSet).descendingSet();
  12.           for (int i =0;i<n;i++){
  13.             String input=cin.next();
  14.             if(input.equals(“male”))
  15.               boySet.add(cin.nextDouble());
  16.             if(input.equals(“female”))
  17.               girlsSet.add(cin.nextDouble());
  18.           }
  19.           for(Double i:boySet) {
  20.             System.out.printf(“%.2f “,i);
  21.           }
  22.           for(Double i:girlsSet) {
  23.             System.out.printf(“%.2f “,i);
  24.           }
  25.         }
  26.     }
  27. }

老师的代码:

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;
  5. import java.util.Scanner;
  6. public class Main {
  7.   public static void main(String[] args) {
  8.       Scanner sc=new Scanner(System.in);
  9.       List<Double> list1=new ArrayList<Double>();
  10.       List<Double> list2=new ArrayList<Double>();
  11.     int n=sc.nextInt();
  12.     for(int i=0;i<n;i++){
  13.       String sex=sc.next();
  14.       double shengao=sc.nextDouble();
  15.       if(“male”.equals(sex)){
  16.         list1.add(shengao);
  17.       }
  18.       else{
  19.         list2.add(shengao);
  20.       }
  21.     }
  22.     Collections.sort(list1);
  23.     Collections.sort(list2,new Comparator<Double>(){
  24.       @Override
  25.       public int compare(Double arg0, Double arg1) {
  26.        // TODO Auto-generated method stub
  27.         return arg1.compareTo(arg0);
  28.       }
  29.     });
  30.     for(Double d:list1){
  31.       System.out.printf(“%.2f “,d);
  32.     }
  33.     for(Double d:list2){
  34.       System.out.printf(“%.2f “,d);
  35.     }
  36. }
  37. }

3:确定进制

描述

6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13) = 42(13), 而 42(13) = 4 * 131+ 2 * 130= 54(10)。 你的任务是写一段程序读入三个整数p、q和 r,然后确定一个进制 B(2<=B<=16) 使得 p * q = r. 如果 B有很多选择, 输出最小的一个。例如: p = 11, q = 11, r = 121. 则有 11(3) * 11(3) = 121(3) 因为 11(3) = 1 * 31+ 1 * 30= 4(10) 和 121(3) = 1 * 32+ 2 * 31+ 1 * 30= 16(10)。 对于进制 10,有 11(10) * 11(10) = 121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。

输入一行,包含三个整数p、q、r,相邻两个整数之间用单个空格隔开。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。输出一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。样例输入

6 9 42

样例输出

13

这个题可以说是很坑了,用的进制转换。

先上我的错误代码:

  1. import java.util.Scanner;
  2. public class Main {
  3.     public static void  main(String[] args){
  4.         Scanner cin=new Scanner(System.in);
  5.         String p=cin.next();
  6.         String q=cin.next();
  7.         String r=cin.next();
  8.         int out=0,i=1;
  9.         for(i=2;i<=32;i++)
  10.         {
  11.           Integer a=Integer.parseInt(p,i);
  12.           Integer b=Integer.parseInt(q,i);
  13.           Integer c=Integer.parseInt(r,i);
  14.           if(a*b==c)
  15.             break;
  16.       }
  17.           if(i<=32)
  18.             System.out.println(i);
  19.           else System.out.println(“0”);
  20.     }
  21. }

错误原因未知(CE),调试不了了,于是改写手动进制转换。

  1. import java.util.Scanner;
  2. public class Main{
  3.   public static void  main(String[]args) {
  4.     Scanner cin=new Scanner(System.cin);
  5.     int a=cin.nextInt(),b=cin.nextInt(),c=cin.nextInt();
  6.     boolean flag=true;
  7.     for(int i=2;i<=16;i++) {
  8.       if((judge(a,i)*judge(b,i))==judge(c,i)) {
  9.         System.out.println(i);
  10.         flag=false;
  11.         break;
  12.       }
  13.     }
  14.     if(flag)
  15.     System.out.println(0);
  16.   }
  17.   public static  int judge(int x,int B) {//进制转换函数
  18.     int value=1,num=0;
  19.     while(x!=0) {
  20.       if((x%10)>=B) {
  21.         return 99999;
  22.       }
  23.       num+=((x%10)*value);
  24.       value*=B;
  25.       x/=10;
  26.     }
  27.     return num;
  28.   }
  29. }

老师发的标准答案:(多了一个try-catch的结构处理错误!)

  1. import java.io.IOException;
  2. import java.util.Scanner;
  3. public class Main {
  4.   public static void main(String args[]) throws IOException  {
  5.     Scanner sc=new Scanner(System.in);
  6.     String p=sc.next();
  7.     String  q=sc.next();
  8.     String  r=sc.next();
  9.     for(int i=2;i<=16;i++){
  10.       try {
  11.         int p1=Integer.parseInt(p,i);
  12.         int q1=Integer.parseInt(q,i);
  13.         int r1=Integer.parseInt(r,i);
  14.         if(p1*q1==r1){
  15.           System.out.println(i);return;
  16.         }
  17.       } catch (NumberFormatException e) {
  18.        // TODO Auto-generated catch block
  19.       }
  20.     }
  21.     System.out.println(0);
  22.   }
  23. }

发布者

deng

听闻余生久不遇,相逢别错过。

发表评论

电子邮件地址不会被公开。 必填项已用*标注