Pat刷题真题乙级(3)

前言

今天也是努力的一天!加油!

Pat1007(A除以B)

题目链接
题目描述:

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入描述:

输入在1行中依次给出A和B,中间以1空格分隔。

输出描述:

在1行中依次输出Q和R,中间以1空格分隔。

输入例子:

123456789050987654321 7

输出例子:

17636684150141093474 3

分析
A的值非常大,所以要用BigInteger来定义,BigInteger的加减乘除要用里面的方法来表示,例如.add(),它的底层相当于字符串。

ac代码为:

import java.math.BigInteger;
import java.util.HashMap;
import java.util.Scanner;
//author:bigsai&bigpian
public class Niuk1007 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        BigInteger a=scan.nextBigInteger();
        BigInteger b =scan.nextBigInteger();
        BigInteger q=a.divide(b);
        BigInteger r=a.mod(b);//a%b
        if(a.equals((b.multiply(q)).add(r))){
    
    
            System.out.print(q+" "+r);
        }
    }
}

Pat1008(锤子剪刀布)

题目链接
题目描述:

大家应该都会玩“锤子剪刀布”的游戏:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入描述:

输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代
表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。

输出描述:

输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯
一,则输出按字母序最小的解。

输入例子:

10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

输出例子:

5 3 2
2 3 5
B B

分析
这题的逻辑很重要,我写的这个代码还是偏复杂一点。

ac代码为:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Niuk1008 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        scan.nextLine();
        int a1=0,a2=0,a3=0;//胜平负
        int b1=0,b2=0,b3=0;
        int c1=0,c2=0,c3=0;
        int d1=0,d2=0,d3=0;
        Map<String,Integer> map=new HashMap<>();
        Map<String,Integer> map1=new HashMap<>();

        for(int i = 0;i<n;i++){
    
    
            String a = scan.next();
            String b = scan.next();
            if(a.equals("C")){
    
    //C代表“锤子”、J代表“剪刀”、B代表“布”
                if(b.equals("J")) {
    
    
                    a1++;
                    map.put("C",c1++);
                    b3++;
                }
                else if(b.equals("B")) {
    
    
                    b1++;
                    map1.put("B",d3++);
                    a3++;
                }
                else if(b.equals("C")) {
    
    b2++;a2++;}
            }
            if(a.equals("J")){
    
    //C代表“锤子”、J代表“剪刀”、B代表“布”
                if(b.equals("J")) {
    
    b2++;a2++;}
                else if(b.equals("B")) {
    
    
                    b3++;
                    a1++;
                    map.put("J",c2++);
                }
                else if(b.equals("C")) {
    
     a3++;b1++; map1.put("C",d1++);}
            }
            if(a.equals("B")){
    
    //C代表“锤子”、J代表“剪刀”、B代表“布”
                if(b.equals("J")) {
    
    b1++;a3++; map1.put("J",d2++);}
                else if(b.equals("B")) {
    
    a2++;b2++;}
                else if(b.equals("C")) {
    
    a1++;b3++; map.put("B",c3++);}
            }

        }
        System.out.println(a1+" "+a2+" "+a3);
        System.out.println(b1+" "+b2+" "+b3);
        String m="",m1="";int max=-1,max1=-1;
        for(String tmp:map.keySet()){
    
    
            if(max<map.get(tmp))
            {
    
    
                max = map.get(tmp);
                m = tmp;
            }
            else if(max==map.get(tmp))// "B" 3  "C" 3
            {
    
    
                if(tmp.charAt(0)<m.charAt(0))
                {
    
    
                    m = tmp;
                }
            }
        }
        for(String tmp:map1.keySet()){
    
    
            if(max1<map1.get(tmp))
            {
    
    
                max1= map1.get(tmp);
                m1 = tmp;
            }
            else if(max1==map1.get(tmp))// "B" 3  "C" 3
            {
    
    
                if(tmp.charAt(0)<m1.charAt(0))
                {
    
    
                    //max = map.get(tmp);
                    m1 = tmp;
                }
            }
        }
        if(m.equals("")){
    
    m="B";}
        if(m1.equals("")){
    
    m1="B";}
        System.out.print(m+" "+m1);
    }
}

Pat1009(数字黑洞)

题目链接
题目描述:

给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到
一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。

例如,我们从6767开始,将得到

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …

现给定任意4位正整数,请编写程序演示到达黑洞的过程。

输入描述:

输入给出一个(0, 10000)区间内的正整数N。

输出描述:

如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例,每行中间没有空行。注意每个数字按4位数格
式输出。

输入例子:

6767

输出例子:

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

分析
如果得出数字中有0,在排升序时要注意,输出时前面要有0的存在。

ac代码为:

import java.util.Scanner;
public class Niuk1009 {
    
    
  static int  paixu(int x,int a[]){
    
    
      int t,z=0;
        a[0] = x/1000;
        a[1] = x/100%10;
        a[2] = x/10%100%10;
        a[3] = x%1000%100%10;
        for(int i=0;i<4;i++){
    
    
            for(int j=i+1;j<4;j++){
    
    
                if(a[i]<a[j]){
    
    
                    t = a[i];
                    a[i] = a[j];
                    a[j] = t;
                }
            }
        }
        int p = a[0]*1000+a[1]*100+a[2]*10+a[3];//减数
        int q = a[0]+a[1]*10+a[2]*100+a[3]*1000;//被减数
        int m = p-q;
      for(int j=0;j<4;j++){
    
    
          if(a[j]==0){
    
    
              z++;
          }
      }
      if(z==0){
    
    System.out.println(p+" - "+q+" = "+m);}
      else if(z==1){
    
    System.out.println(p+" - "+"0"+q+" = "+m);}
      else if(z==2){
    
    System.out.println(p+" - "+"00"+q+" = "+m);}
      else if(z==3){
    
    System.out.println(p+" - "+"000"+q+" = "+m);}
        return m;
    }
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] a = new int[4];
        int m,p,q;
        a[0] = n/1000;
        a[1] = n/100%10;
        a[2] = n/10%100%10;
        a[3] = n%1000%100%10;
        if((a[0]==a[1])&&(a[1]==a[2])&&(a[2]==a[3])){
    
    
            System.out.println("N - N = 0000");
        }else {
    
    
            do{
    
    
                m=paixu(n,a);   //启用函数
                n=m;   //n要改变
            }while(m!=6174);
            }
        }
    }

Pat1012(D进制的A+B)

题目链接
题目描述:

输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数。

输入描述:

输入在一行中依次给出3个整数A、B和D。

输出描述:

输出A+B的D进制数。

输入例子:

123 456 8

输出例子:

1103

分析
先要了解进制之间的转换,把余数转换成字符输出。
ac代码为:

import java.util.Scanner;
public class Niuk1012 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();
        int b = scan.nextInt();
        int c = scan.nextInt();
        int d=a+b;
        // d的10进制转换成 c进制
        //10进制:25  3进制:""
        // int d=25 c=3
        //10进制:d%3=1 d=d/3=8   3进制:"1"
        //10进制:d%3=2 d=d/3=2  3进制:"21"
        //10进制:d%3=2 d=d/3=0  6进制:"221"
        //d=0 停止
        String va="";
        while (d>0)
        {
    
    
            va= d%c+va;
            d=d/c;
        }
        System.out.println(va);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41638508/article/details/105441111