蓝桥杯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日冲刺打卡).