day16—编程题
Posted 若知hui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day16—编程题相关的知识,希望对你有一定的参考价值。
文章目录
1.第一题
1.1题目
描述:
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。
输入描述:
输入一个数字n
输出描述:
输出不超过n的完全数的个数
1.2思路
- 写一个函数专门求一个数的约数
- 从2开始遍历输入的数之前的所有数
- 将这个数的所有约数全部加起来看是不是等于他本身,如果相等结果值就加1
1.3解题
import java.util.*;
public class Main
//求一个数的约数
public static List<Integer> div(int n)
List<Integer> list = new ArrayList<>();
for(int i = 2; i <= Math.sqrt(n);i++)
if(n % i == 0)
list.add(i);
if( n / i != i)
list.add(n/i);
return list;
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = 0;
//由于完全数的约数的和是要出去该数本身的,而1的约数只有1,所以要从2开始
for(int i = 2;i <= n;i++)
List<Integer> list = div(i);
int ret = 0;
//将这个数除去1和他本身的约数全部加起来
for(int j = 0;j < list.size();j++)
ret += list.get(j);
//如果这个数除去1和他本身的约数全部加起来再加上1等于他本身,就让count++
if(ret + 1 == i)
count++;
//这里记得每统计完一个数,ret要置为0
ret = 0;
System.out.println(count);
2.第二题
2.1题目
描述:
扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王)
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER
请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR
基本规则:
(1)输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)
(3)大小规则跟大家平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;
(4)输入的两手牌不会出现相等的情况。
提示:
(1)除了炸弹和对王之外,其他必须同类型比较。
(2)输入已经保证合法性,不用检查输入是否是合法的牌。
(3)输入的顺子已经经过从小到大排序,因此不用再排序了
输入描述:
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如4 4 4 4-joker JOKER。
输出描述:
输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR
2.2涉及的相关知识
public String substring(int beginIndex, int endIndex)
beginIndex:起始索引(包括)
endIndex:终止索引(不包括)
返回值:String
int indexOf(String str)
返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1
split() 方法根据匹配给定的正则表达式来拆分字符串
public String[] split(String regex, int limit)
regex:正则表达式分隔符
limit:分割的份数
equals() 方法用于判断 Number 对象与方法的参数进是否相等
public boolean equals(Object o)
参数: 任何对象
返回值:如 Number 对象不为 Null,且与方法的参数类型与数值都相等返回 True,否则返回 False
2.2思路
- 将输入的这个字符串用-分隔开并存放在字符串数组中,然后将每一方的牌用空格隔开也存放在字符串数组中
- 判断哪一方的牌大就输出
- 如果有任意一方的牌是对王,则输出对王;如果两方的字符串长度相等,比较两个字符串数组第一个字符在给定的字符串中出现的位置的大小将大的输出;考虑一方有炸弹的情况;如果都没有就输出ERROR
2.3解题
import java.util.*;
public class Main
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
//将str这个字符串用-分隔开并存放在字符串数组中
String[] pp = str.split("-");
String[] p1 = pp[0].split(" ");
String[] p2 = pp[1].split(" ");
String p = "34567891JQKA2";
//如果有任意一方的牌是对王,则输出对王
if (pp[0].equals("joker JOKER") || pp[1].equals("joker JOKER"))
System.out.println("joker JOKER");
else if (p1.length == p2.length)
//比较两个字符串数组第一个字符在给定的字符串中出现的位置的大小
if(p.indexOf(p1[0].substring(0,1)) > p.indexOf(p2[0].substring(0,1)))
System.out.println(pp[0]);
else
System.out.println(pp[1]);
else if (p1.length == 4)
//考虑有一方是有炸弹的情况
System.out.println(pp[0]);
else if (p2.length == 4)
System.out.println(pp[1]);
else
System.out.println("ERROR");
day19—编程题
文章目录
1.第一题
1.1题目
描述:
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。
输入描述:
输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
1.2思路
- 喝到的汽水数=空瓶子的数/3
- 空瓶子的数=空瓶子的数/3+空瓶子的数%3
- 如果剩下两个空瓶子可以向老板借一瓶汽水,记得把喝到的汽水数加一
1.3解题
import java.util.*;
public class Main
public static int getSum(int num)
int sum = 0;
while(num > 1)
//喝到的汽水的数量
sum += num / 3;
//空瓶子的数量
num = num /3 + num % 3;
//如果剩下两个空瓶子可以向老板借一瓶汽水
if(num == 2)
sum++;
break;
return sum;
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int num;
//这里是因为最后一个输入0表示结束,不用输出结果
while((num = sc.nextInt()) != 0)
System.out.println(getSum(num));
2.第二题
2.1题目
描述:
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
2.2思路
- 将字符串转化为字符串数组
- 定义一个二维数组统计当前最长字符串的长度
- 如果第i个字符和第j个字符相等,就进行累加
- 如果会面出现了更长的子串记得更新最长子串的长度以及最长子串起始的位置
- 记得根据输入的两个字符串的长度判断输出结果
2.3解题
import java.util.*;
import java.io.*;
public class Main
public static String getMaxStr(String str1, String str2)
char[] ch1 = str1.toCharArray();
char[] ch2 = str2.toCharArray();
//多增加一行一列,作为辅助状态
int[][] arr = new int[ch1.length + 1][ch2.length + 1];
int sumLen = 0;//最长公共子串的长度
int start = 0;//最长公共子串的起始位置
//状态:以str1的第i个字符结尾和以str2的第j个字符结尾的最长公共子串的长度
for (int i = 1; i <= ch1.length; i++)
for (int j = 1; j <= ch2.length; j++)
//如果第i个字符和第j个字符相等,则进行累加
if (ch1[i - 1] == ch2[j - 1])
arr[i][j] = arr[i - 1][j - 1] + 1;
if (sumLen < arr[i][j])
sumLen = arr[i][j];
start = i - sumLen;
return str1.substring(start, start + sumLen);
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
String str1 = sc.nextLine();
String str2 = sc.nextLine();
if (str1.length() < str2.length())
System.out.println(getMaxStr(str1, str2));
else
System.out.println(getMaxStr(str2, str1));
以上是关于day16—编程题的主要内容,如果未能解决你的问题,请参考以下文章
Python全栈开发,Day16 - Web前端-JavaScript