1、受伤的皇后
经典题,注意对角线的判断,距离3+不用管
有一个 n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n 个受伤的国际象棋皇后,要求:
请问一共有多少种摆放方案。
输入的第一行包含一个整数 n。
其中,1≤n≤10。
输出一个整数,表示答案。
示例 1
输入
4
输出
2
import java.util.Scanner;
public class Main {
public static int sum = 0;
public static int n;
public static int[] a = new int[110];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
dfs(1);
System.out.println(sum);
}
public static void dfs(int row) {
if (row > n) {//一种摆放方案
sum++;
return;
}
for (int i = 1; i <= n; i++) {//遍历能放的列
if (check(row, i)) {
a[row] = i;
dfs(row + 1);
a[row] = 0;//回溯
}
}
}
public static boolean check(int r, int c) {
for (int i = 1; i <= r; i++) {//枚举r行可以放置的列
if (a[i] == c) {//如果有列和当前放置的所有皇后有列冲突则返回false
return false;
}
if(Math.abs(r-i)==Math.abs(a[i]-c)){//只要已经有的皇后在将要放置的皇后在同一条对角线上,其行号与列号对应相减的绝对值绝对是相等的
return false;//例如:正对角线情况,(2,2)(1,1)2-2==1-1 次对角线情况,(3,2)(2,3)3-2==2-3
} //所以我们只需要用abs判断即可
}
return true;
}
}
2、完全平方数
一个整数 a 是一个完全平方数, 是指它是某一个整数的平方, 即存在一个 整数 b, 使得 a=b2 。
给定一个正整数 n, 请找到最小的正整数 x, 使得它们的乘积是一个完全平 方数。
输入一行包含一个正整数 n 。
输出找到的最小的正整数 x 。
12
3
15
15
对于 30 的评测用例, 1≤n≤1000, 答案不超过 1000 。
对于 60 的评测用例, 1≤n≤108, 答案不超过 108108 。
对于所有评测用例, 1≤n≤1012, 答案不超过 10121012 。
第一次暴力过40%
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
static long n = 0L;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextLong();
for(long i = 1;i<=n;i++){
if(i*n==check(i)){
System.out.println(i);
return;
}
}
}
static long check(long i){
for(long j=1;j<=n;j++){
if(i*n==j*j){
return j*j;
}
}
return 0;
}
}
2、简便方法
import java.util.*;
public class Main {
static long n = 0L;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextLong();
long res =0L;
for(long i =1;i<=Math.sqrt(n);i++) {
if(n % (i*i) == 0) {//一个数如果是完全平方数则其所有质因子出现的频率均为偶数
res = n / (i * i);
}
}
System.out.println(res);
}
}
4、求阶乘
满足 N ! 的末尾恰好有 K 个 0 的最小的 N 是多少?
如果这样的 N 不存在输出 −1 。
一个整数 K 。
一个整数代表答案。
2
10
对于 30%30% 的数据, 1≤K≤106.
对于 100%100% 的数据, 1≤K≤1018.
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long k = sc.nextLong();
long l = 0L;
long r = Long.MAX_VALUE;
while(l>1;//数字目标在二分的左边
if(check(mid)>=k){//找到符合条件的最小数
r = mid;
}
else{
l = mid+1;
}
}
if(check(r)==k){
System.out.println(r);
}
else{
System.out.println(-1);
}
}
static long check(long n){//一个数的阶乘,其包含几个5即为末尾0的个数,参考唯一分解定理,例如10!=3628800,10/5=2
long res = 0L;
while(n>0){
res+=n/5;
n/=5;
}
return res;
}
}