当前位置: 代码迷 >> 综合 >> 蓝桥杯31天冲刺 Day4
  详细解决方案

蓝桥杯31天冲刺 Day4

热度:30   发布时间:2023-11-27 09:39:23.0

蓝桥杯31天冲刺 Day4

    • 奇数倍数
    • 第几个幸运数字
    • 四平方和

奇数倍数

链接: 奇数倍数

在这里插入图片描述
直接暴力枚举就好了

代码:

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {
    public static void main(String[] args) {
    int i = 3;long x = 2019;boolean flag=true;while(flag){
    long n = i*x;char[] chars = Long.toString(n).toCharArray();for(int j =0;j<chars.length;j++){
    if((chars[j]-'0')%2==0){
    break;}if(j==chars.length-1){
    System.out.println(n);flag=false;}}i = i+2;}}
}

第几个幸运数字

链接: 第几个幸运数字.
在这里插入图片描述
直接枚举就好了

相当于要我们求3的k次方和5的j次方和7的i次方相加等于59084709587505
需要注意的是由于较小的数字在前,需要把较小的数放在循环内部(比如把3放在循环最里面)

像这种基本的枚举一定要用循环来写!!!

代码:

import java.util.*;public class 第几个幸运数字 {
    public static void main(String[] args) {
    long x =59084709587505L;//System.out.println(x);int count = 0;for(long i=0;Math.pow(7, i)<x;i++){
    for(long j=0;Math.pow(5, j)<x;j++){
    for(long k=0;Math.pow(3, k)<x;k++){
    if(Math.pow(7, i)*Math.pow(5, j)*Math.pow(3, k)<x){
    count++;}}}}System.out.println(count);}}

四平方和

链接: 四平方和

四平方和定理,又称为拉格朗日定理:
  每个正整数都可以表示为至多4个正整数的平方和。
  如果把0包括进去,就正好可以表示为4个数的平方和。
  比如:
  5 = 0^2 + 0^2 + 1^2 + 2^2
  7 = 1^2 + 1^2 + 1^2 + 2^2
  (^符号表示乘方的意思)
  对于一个给定的正整数,可能存在多种平方和的表示法。
  要求你对4个数排序:
  0 <= a <= b <= c <= d
  并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法
  程序输入为一个正整数N (N<5000000)
  要求输出4个非负整数,按从小到大排序,中间用空格分开
  例如,输入:
  5
  则程序应该输出:
  0 0 1 2
  再例如,输入:
  12
  则程序应该输出:
  0 2 2 2
  再例如,输入:
  773535
  则程序应该输出:
  1 1 267 838
  资源约定:
  峰值内存消耗 < 256M
  CPU消耗 < 3000ms

这题和上题类似,也是循环枚举。但是,如果写4个循环复杂度很高,我们可以使用分组来枚举,也就是将a,b分成一组,c,d分成一组

由于我们想要尽可能缩小搜索范围,我们就应该先确定较大的数,通过将较大两位数(c,d)与计算的数(n)相减,就可以确定较小两位数(a,b)的确定值了。实现这一过程的代码如下:

    if(hash.containsKey(n-t)){
    Node node =hash.get(n-t);System.out.println(a+" "+b+" "+node.c+" "+node.d);return;}

还有很重要的一点就是:我们需要记录下最先枚举的c,d的平方和的值还有它们各自的取值。
这点我们很容易想到使用HashMap来解决。同时value只能接受一种类型,我们再额外写一个Node类就可以解决。

map的创建和Node类的写法如下:

Map<Integer,Node> hash = new HashMap<Integer,Node>();
---------------------------------------------------------------
class Node{
    int c;int d;public Node(int c,int d){
    this.c = c;this.d = d; }
}

整体解题代码:

import java.util.*;public class 四平方和 {
    public static void main(String[] args) {
    // TODO Auto-generated method stubMap<Integer,Node> hash = new HashMap<Integer,Node>();Scanner sc = new Scanner(System.in);int n = sc.nextInt();for(int c=0;c*c<n;c++){
    for(int d=c;d*d+c*c<=n;d++){
    int t =d*d+c*c;if(!hash.containsKey(t)){
    hash.put(t, new Node(c,d));}}}for(int a=0;a*a<n;a++){
    for(int b=a;b*b+a*a<=n;b++){
    int t = b*b+a*a;if(hash.containsKey(n-t)){
    Node node =hash.get(n-t);System.out.println(a+" "+b+" "+node.c+" "+node.d);return;}}}}}class Node{
    int c;int d;public Node(int c,int d){
    this.c = c;this.d = d; }
}

思路参考: 【蓝桥真题4】练练填空就想进国赛?拿下大题才能让你真正有底气(蓝桥31日冲刺打卡).