奇数倍数
链接: 奇数倍数
直接暴力枚举就好了
代码:
import java.util.Scanner;
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;
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) {
Map<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日冲刺打卡).
|