前言
今天也是努力的一天!加油!
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
扫描二维码关注公众号,回复: 12731155 查看本文章![]()
输出例子:
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);
}
}