java测验-1 题解

java小测验的题解~

1:反向输出一个三位数

描述
将一个三位数反向输出。
输入
一个三位数n。
输出
反向输出n。
样例输入
100
样例输出
001

水题:逆序输出即可。

import java.util.Scanner;
public class Main
{
  public static void main(String []args)
  {
    Scanner cin=new Scanner(System.in);
    String string=cin.nextLine();
    for(int i=string.length()-1;i>=0;i--)
    {
      System.out.print(string.charAt(i));
    }
  }
}

2:素数对

描述
两个相差为2的素数称为素数对,如5和7,17和19等,本题目要求找出所有两个数均不大于n的素数对。
输入
一个正整数n。1 <= n <= 10000。
输出
所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。
样例输入
100
样例输出
3 5
5 7
11 13
17 19
29 31
41 43
59 61
71 73

按照题目要求模拟即可。别忘了判断范围
(isprime(i)==1)&&(isprime(i+2)==1)&&((i+2)<=n)

import java.util.Scanner;
public class Main {
    public static int isprime(int m)//判断是否为素数
    {
        int k=(int)(Math.sqrt((double)m));
        int i=2;
        while(m%i!=0&&i<=k)  i++;
        if(i>k) return 1;
        else return 0;
    }
    public static void  main(String[] args){
        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        int flag=0;
       for(int i=2;i<=n;i++){
           if((isprime(i)==1)&&(isprime(i+2)==1)&&(i+2)<=n) {
               flag=1;
               System.out.println(i + " " + (i + 2));
           }
       }
       if(flag==0){
           System.out.println("empty");
       }
        cin.close();
    }
}

3:明明的随机数

描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了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

很经典的题,大一C++期末考试也考过。去重排序用set即可。(万年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+" ");
          }
        }
    }
}

4:合影效果

描述

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

输入第一行是人数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();

更多关于descendingSet()方法的资料:点我~

我的代码:

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<Double> boySet=new TreeSet<Double>();
          Set<Double> girlsSet=new TreeSet<Double>();
          girlsSet = ((TreeSet<Double>) girlsSet).descendingSet();
          for (int i =0;i<n;i++){
        	  String input=cin.next();
        	  if(input.equals("male"))
        		  boySet.add(cin.nextDouble()); 
        	  if(input.equals("female"))
        		  girlsSet.add(cin.nextDouble()); 
          }
        
          for(Double i:boySet) {
        	  System.out.printf("%.2f ",i);
          }
          for(Double i:girlsSet) {
        	  System.out.printf("%.2f ",i);
          }
        }
    }
    
}

老师的代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
  
      Scanner sc=new Scanner(System.in);  
      List<Double> list1=new ArrayList<Double>();
      List<Double> list2=new ArrayList<Double>();
    int n=sc.nextInt();
    for(int i=0;i<n;i++){
      String sex=sc.next();
      double shengao=sc.nextDouble();
      if("male".equals(sex)){
        list1.add(shengao);
      }
      else{
        list2.add(shengao);
      }
    }
    Collections.sort(list1);
    Collections.sort(list2,new Comparator<Double>(){

      @Override
      public int compare(Double arg0, Double arg1) {
        // TODO Auto-generated method stub
        return arg1.compareTo(arg0);
      }
      
    });
    
    for(Double d:list1){
      System.out.printf("%.2f ",d);
    }
    for(Double d:list2){
      System.out.printf("%.2f ",d);
    }
    
}
}

5:确定进制

描述

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

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

先上我的错误代码:

import java.util.Scanner;
public class Main {
    public static void  main(String[] args){
        Scanner cin=new Scanner(System.in);
        String p=cin.next();
        String q=cin.next();
        String r=cin.next();
        int out=0,i=1;
        for(i=2;i<=32;i++)
        {
          Integer a=Integer.parseInt(p,i);
          Integer b=Integer.parseInt(q,i);
          Integer c=Integer.parseInt(r,i);
          if(a*b==c)
            break;	    
      }
          if(i<=32)
            System.out.println(i);
          else System.out.println("0");
    }
}

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

import java.util.Scanner;

public class Main{
  public static void  main(String[]args) {
    Scanner cin=new Scanner(System.cin);
    int a=cin.nextInt(),b=cin.nextInt(),c=cin.nextInt();
    boolean flag=true;
    for(int i=2;i<=16;i++) {
      if((judge(a,i)*judge(b,i))==judge(c,i)) {
        System.out.println(i);
        flag=false;
        break;
      }
    }
    if(flag)
    System.out.println(0);
  }
  public static  int judge(int x,int B) {//进制转换函数
    int value=1,num=0;
    while(x!=0) {
      if((x%10)>=B) {
        return 99999;
      }
      num+=((x%10)*value);
      value*=B;
      x/=10;
    }
    return num;
  }
  
}

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

import java.io.IOException;
import java.util.Scanner;
public class Main {
  public static void main(String args[]) throws IOException  {
    Scanner sc=new Scanner(System.in);
    String p=sc.next();
    String  q=sc.next();
    String  r=sc.next();
    for(int i=2;i<=16;i++){
      try {
        int p1=Integer.parseInt(p,i);
        int q1=Integer.parseInt(q,i);
        int r1=Integer.parseInt(r,i);
        if(p1*q1==r1){
          System.out.println(i);return;
        }
      } catch (NumberFormatException e) {
        // TODO Auto-generated catch block
        
      }
    }
    System.out.println(0);
  }
}

 

 

点赞

发表评论

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

3 − 1 =