计挑赛
一.2020年能力挑战赛初赛
1-1题目
1-1 统计1到N的整数中,被A除余A-1的偶数的个数
输入说明:整数 N(N<10000), A, (A<N)
输出说明:符合条件的数的个数
输入样例:10 3
输出样例:2
(说明:样例中符合条件的2个数是 2、8)
1.1解题思路
- 先使用java.util.Scanner类进行接收输入N,A
- 1到N整数的偶数控制可使用for循环for(int i=2;i<N;i+2)
- 使用if(i%A==A-1)就将count++
- 代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int N=input.nextInt();//读入整数
int A=input.nextInt();//读入A
int count=0;
for(int i=2;i<=N;i+=2){
if(i%A==A-1){
count++;
}
}
System.out.println(count);
}
}
1-2题目
1-2 统计1到N的整数中,除了1和自身之外,至少还能被两个数整除的数的个数
输入说明:整数 N(N<10000);
输出说明:符合条件的数的个数
输入样例:10
输出样例:3
(说明:样例中符合条件的3个数是6、8、10)
1.1解题思路
- 质数的定义:质数又叫素数,指的是大于1的自然数,除了1和本身外,不能被其他数整除的数叫质数。或者定义为:大于1的自然数,除了1和本身外不在用于其他因数。
import java.lang.Math;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int N=input.nextInt();
int count=0;
for(int i=2;i<=N;i++){
if(test(i)){
count++;
}
}
System.out.println(count);
}
public static boolean test(int n){
int N=(int)Math.sqrt(n);
boolean flag=false;
for(int i=2;i<=N;i++){
if(n%i==0&&n/i!=i){
flag=true;
}
}
return flag;
}
}
1-3题目
1-3 统计从1到N的整数中,所有立方值的平方根为整数的数的个数
输入说明:整数 N(N<10000);
输出说明:符合条件的数的个数,如4的3次方=64=8的2次方
输入样例:10
输出样例:3
(说明:样例中符合条件的3个数是1、4、9)
1e-6参考链接
1e-6 :
- 1e-6表示1乘以10的负6次方。
- Math.abs(x)<1e-6其实相当于x==0
- 1e-6(也就是0.000001)叫做epslon,用来抵消浮点运算中因为误差造成的相等无法判断的情况。它通常是一个非常小的数字(具体多小要看你的运算误差)
//方法一:
import java.util.Scanner;
import java.lang.Math;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int ans = 0;
for(int i = 1;i <= N;i++){
double temp = Math.pow(i,3);
double temp1=Math.sqrt(temp);
if(Math.abs(temp1 - (int)temp1) < 1e-6){
ans++;
}
}
System.out.println(ans);
}
}
//方法二:
import java.util.Scanner;
import java.lang.Math;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int ans = 0;
for(int i = 1;i <= N;i++){
double temp = Math.pow(i,3);
double temp1=Math.sqrt(temp);
if(temp1==(int)temp1){
ans++;
}
}
System.out.println(ans);
}
}
//方法三:
import java.util.Scanner;
import java.lang.Math;
import java.lang.Double;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int ans = 0;
for(int i = 1;i <= N;i++){
double temp=Math.pow(i,3);
double temp1=Math.sqrt(temp);
String string=Double.toString(temp1);
int index=string.indexOf(".");
String substring=string.substring(index+1);
if(substring.equals("0")){
ans++;
}
}
System.out.println(ans);
}
}
//方法四:
import java.util.Scanner;
import java.lang.Math;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int ans = 0;
for(int i = 1;i <= N;i++){
int temp = (int) Math.sqrt(i*i*i);
int Value = temp*temp ;
int realValue = i*i*i;
if(realValue==temp){
ans++;
}
}
System.out.println(ans);
}
}
2-1题目
2-1 小明今天收了N个鸡蛋,每个鸡蛋各有重量,现在小明想找M个重量差距最小的鸡蛋摆成一盒出售,输出符合条件的最重一盒鸡蛋的总重量
输入说明:第一行,鸡蛋个数N(N<1000) 每盒个数M(M<N);第二行,N个鸡蛋重量(浮点)
输出说明:符合条件的最重一盒鸡蛋的总重量(保留2位小数)
输入样例:8 4
11 9 12 5 10 19 8 6
输出样例:42.00
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner input=new Scanner(System.in);
int N=input.nextInt();
int M=input.nextInt();
ArrayList<Double> weight=new ArrayList<>();
for(int i=0;i<N;i++){
weight.add(input.nextDouble());
}
Collections.sort(weight,new Comparator<Double>(){
@Override
public int compare(Double o1,Double o2){
if(o1>o2){
return 1;
}else if(o1==o2){
return 0;
}
return -1;
}
});
double maxSum=0;
double minDifferValue=Double.MAX_VALUE;
for(int i=0;i<N-M;i++){
double sum=0;
double differValue=weight.get(i+M-1)-weight.get(i);
for(int j=0;j<M;j++){
sum+=weight.get(j+i);
}
if(differValue<= minDifferValue){
maxSum=sum;
minDifferValue=differValue;
}
}
System.out.println(maxSum);
}
}
2-3题目
2-3 给出长度为N的各不相同整数组成的数组,求解2个数相加为M的情况个数。
输入说明:
第一行,2个空格分隔的整数,分别表示数组中元素个数N(N<1000) 和值M;
第二行,N个用空格分隔的数组元素(整数)。
输出说明:
一行,一个整数,为相加为M的情况个数。
输入样例:
8 10
1 4 2 5 3 19 8 6
输出样例:
2
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner input=new Scanner(System.in);
int N=input.nextInt();
int M=input.nextInt();
int[] array=new int[N];
int count=0;
for(int i=0;i<N;i++){
array[i]=input.nextInt();
}
for(int i=0;i<N;i++){
for(int j=i+1;j<N;j++){
if((array[i]+array[j])==M){
count++;
}
}
}
System.out.println(count);
}
}
3-1题目
3-1 在一个由小写字母(a-z)组成的字符串中,查找最长子串,其中头尾字符串相同,中间不包含头尾字符,并输出最左边的该类的子串。
输入说明:
1行,为待处理字串(长度<=200)
输出说明:
1行,为满足条件的子串
输入样例:
adfasjdoiasldhlfa
输出样例:
fasjdoiasldhlf
解题思路
1.头尾字母相同
2.中间不含头尾字母
3.符合上述条件中最长的
逐个解决:
1.循环遍历字符串每个字母,查询当前字母的下一个相同字母的位置,即可获取当前字母对应子串的长度
注意:应先处理特殊情况,即当前字母不会再次出现且子串为空。这种情况直接赋予当前字母作为子串初值。
这样遍历结束就可以找出所有符合条件1、2的子串。
2.在遍历中加入对子串长度的判断,记录长度初值为0,若经过特殊处理则长度为1。
在遍历中,如果符合条件的新子串长度大于旧子串的长度,则更新长度和子串。
此处判断使用大于,即长度相等时取用左边的子串。
遍历结束则找出符合条件的最左边的最长子串。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
public static void main(String args[])throws IOException{
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String str=stdin.readLine();
int len=0;
String out="";
for(int i=0;i<str.length();i++){
int nextchar=str.indexOf(str.charAt(i),i+1);
if(nextchar==-1&&len==0){
out=out+str.charAt(i);
len++;
}else{
if(nextchar-i>len){
len=nextchar-i;
out=str.substring(i,nextchar+1);
}
}
}
System.out.println(out);
}
}
3-2题目
3-2 在一个小写英文字母(a-z)中组成的字符串的最短子串,其包含这个字符串的所有出现的字母。输出最左边的该类子串。
输入说明:
一行,为待处理字串(长度<=200);
输出说明:
一行,为满足条件的子串
输入样例:
adfasjdoiasdlfa
输出样例:
fasjdoi
解题思路:
1.包含这个字符串中所有出现的字母
2.符合最左边的最短子串
解题步骤:
1.循环遍历字符串,取出所有出现的字母,储存备用;
2.在循环遍历中加入对子串长度的判断,记录初始化长度为最大值,查找切分所有可能出现的子串,根据1中取出的字母检查子串是否包含所有出现的字母。
检查通过:判断子串长度是否小于记录长度。
小于记录:更新子串以及记录长度。
此处判断长度使用小于,即当长度相等时取用左边的子串。
循环结束即获得符合条件且在最左边的最短子串。
import java.io.*;
public class Main{
public static void main(String args[]) throws IOException{
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String all="";
int len=444;
String out="";
String str=stdin.readLine();
for(int i=0;i<str.length();i++){
if(all.indexOf(str.charAt(i))==-1){
all=all+str.charAt(i);
}
}
for(int i=0;i<str.length();i++){
for(int j=i;j<str.length();j++){
if(check(str.substring(i,j+1),all)){
if(j-i<len){
out=str.substring(i,j+1);
len=out.length();
}
}
}
}
System.out.println(out);
}
public static boolean check(String str,String all){
for(int i=0;i<all.length();i++){
if(str.indexOf(all.charAt(i))==-1){
return false;
}
}
return true;
}
}
3-3
3-3题目描述:
在一个由小写英文字母(a-z)组成的字符串中,查找最短子串,其头尾字母相同。输出最左边的该类子串。
输入说明:
输入一行,处理待字符串(长度<=200)
输出说明:
输出一行,为满足条件的子串
输入样例:
dfasjdoiasldhlfa
输出样例:
ldhl
import java.io.*;
public class Main{
public static void main(String args[]) throws IOException{
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String str=stdin.readLine();
int len=99900;
String out="";
for(int i=0;i<str.length();i++){
int nextChar=str.indexOf(str.charAt(i),i+1);
if(nextChar==-1&&len==0){
out=out+str.charAt(i);
len++;
}else{
if(nextChar>0&&nextChar-i<len){
len=nextChar-i;
out=str.substring(i,nextChar+1);
}
}
}
System.out.println(out);
}
}
4-1题目
4-1题目描述:
某商品有2种不同数量的包装,对应不同的价格;同时提供满200元减50不限量的购物券,试求解最佳的购买策略,在单次购买中以最低总价购买正好500个。
输入说明:
输入一行,为空格分隔的两个整数,分别表示两种包装的数量和价格(均为整数)
输出说明:
输出一行,为空格分隔的两个整数,分别表示两种商品各自购买包数(无解则输出-1)
数入样例:
100 80 200 150
输出样例:
5 0
4-2题目
4-2 某饮料店有两种奶茶饮料,其中一种每瓶含奶粉15g含茶粉5g,另一种每瓶含奶粉10g含茶粉10g。设某天饮料店消耗的奶粉和茶粉重量分别为x(输入)和y(输入)(单位g)求当天饮料店两种饮料的销量。
输入说明:奶粉和茶粉的消耗量(均为整数)
输出说明:两种饮料各自销量(无解则输出:-1)
输入样例:400 300
输出样例:10 25
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner input = new Scanner(System.in);
int x=input.nextInt();
int y=input.nextInt();
float X=(x-y)/10;
float Y=(x-15*X)/10;
if(X==(int)X&&Y==(int)Y&&X>0&&Y>0){
System.out.print(X);
System.out.print(Y);
input.close();
}else{
System.out.print(-1);
}
}
}
二. 模拟题
1 .题目
题目:统计1到N(含)之间的平方数的个数,并输出这个数目
提示:平方数的个数,如4是2的平方数,16是4的平方数,5不是平方数。
输入说明:一个整数N(N<100000);
输出说明:平方数的个数
输入样例:50
输出样例:7
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int N=input.nextInt();
int count=0;
for(int i=1;i<=N;i++){
if(Math.sqrt(i)==(int)(Math.sqrt(i))){
count++;
}
}
System.out.println(count);
}
}
2.题目
2.题目:对于给定长度为N<1000正整数数组,满足连续三个元素均为合数的区间成为3合数区间,计算该数组中三合数的个数
输入说明:第一行数组的元素个数,第二行,N个正整数,用空格分隔开
输出说明:3个合数的区间个数
输入案例:7
6 8 4 9 7 5 8
输出案例:2
解题思路:
合数的定义:指大于1的整数,除了能被1和其自身整除外,还能被其他数整除的数。
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int N=input.nextInt();
int[] a=new int[N];
boolean flag=false;
int count=0;
for(int i=0;i<N;i++) {
a[i]=input.nextInt();
}
for(int i=0;i<a.length-2;i++) {
for(int j=i;j<i+3;j++) {
if(isZhiShu(a[j])) {
flag=true;
}
}
if(!flag) {
count++;
}
}
System.out.println(count);
}
public static boolean isZhiShu(int n) {
boolean flag=true;
for(int i=2;i<n;i++) {
if(n%i==0) {
flag=false;
}
}
return flag;
}
}
3题目
字母连连看,给定一个由小写英文字母组成的字符串(长度<1000),如果字符串中有两个连续的字母相同,则这两个字母可同时消除,并不断重复该操作,直到不能消除为止。请编程判断该字符串是否可以完全消除。
输入说明:一个字符串。
输出说明:如果可以完全消除,输出“YES”,如果不可以,输出消除后的结果。
输入样例1:abacddcaba
输出样例1:YES
输入样例2:asdfghhgf
输出样例2:asd
————————————————
版权声明:本文为CSDN博主「@小聂同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43482906/article/details/111409349
import java.util.Scanner;
public class test2 {
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
String str=input.next();
String s=check(str);
if(s.length()<1) {
System.out.println("YES");
}else {
System.out.println(s);
}
}
public static String check(String str) {
String s1=str;
for(int i=0;i<s1.length()-1;i++) {
if(s1.charAt(i)==s1.charAt(i+1)) {
s1=s1.substring(0,i)+s1.substring(i+2,s1.length());
}
}
if(s1.equals(str)){
return s1;
}else {
return check(s1);
}
}
}
4题目
.统计整数区间[N,M] (N,M<100000)中所有非偶数的合数个数,并输出这个数。
输入说明:两个整数N、M
输出说明:非偶数的合数个数
输入样例:2 16
输出样例:2
public class test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int N=input.nextInt();
int M=input.nextInt();
int count=0;
boolean flag=false;
for(int i=N;i<M;i++){
if(i%2==0){
continue;
}
if(!isZhiShu(i)){
count++;
}
}
System.out.println(count);
}
public static boolean isZhiShu(int n){
for(int i=2;i<n;i++){
if(n%i==0){
return false;
}
}
return true;
}
}
5题目
对于给定的字符数组(字符数少于10000),统计其中字母类型、数字类型和符号类型的字符出现次数,其中字母类型是英文字母a-z之间的字符(不区分大小写);数字类型是0-9之间的字符;符号类型是除英文字母、数字及空格外的其它字符。
输入说明:一个字符序列
输出说明:分三行输出:第一行字母类型,以a-z标识;第二行数字类型,以0-9标识;第三行符号类型,以others标识。每行格式如下:
类别标识出现次数(中间用一个空格分隔)
输入样例: Hello World!
输出样例: a-z 10
0-9 0
others 1
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
int num = 0;
int abz = 0;
int cb=0;
int others = 0;
int cout=0;
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
if ((int) chars[i] == 32) {
continue;
} else if ((int) chars[i] >= 48 && (int) chars[i] <= 57) {
num++;
//continue;
} else if ((int) chars[i] >= 65 && (int) chars[i] <= 90) {
abz++;
//continue;
}else if((int) chars[i]>=97 &&(int)chars[i]<=122) {
cb++;
}
else {
others++;
}
cout=abz+cb;
}
System.out.println("a-z " + cout);
System.out.println("0-9 " + num);
System.out.println("others " + others);
in.close();
}