目录
题目 1 :九数算式_dfs+回溯(全排列)
题目描述
运行限制
代码:
题目2:完全平方数
问题描述
输入格式
输出格式
样例输入 1
样例输出 1
样例输入 2
样例输出 2
评测用例规模与约定
运行限制
代码:
题目 1 :九数算式_dfs+回溯(全排列)
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
观察如下的算式:
9213×85674=789314562
左边的乘数和被乘数正好用到了 1 ~ 9 的所有数字,每个 1 次。 而乘积恰好也是用到了 1 ~ 9 的所有数字,并且每个 1 次。
请你借助计算机的强大计算能力,找出满足如上要求的 9 数算式一共有多少个?
注意:
- 总数目包含题目给出的那个示例。
- 乘数和被乘数交换后作为同一方案来看待。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
代码:
package 第十四届蓝桥杯三月真题刷题训练.day4;
import java.io.*;
import java.util.HashSet;
/**
* @author yx
* @date 2023-03-07 13:13
*/
public class 九数算式_dfs全排列 {
static PrintWriter out =new PrintWriter(System.out);
static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in=new StreamTokenizer(ins);
/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
*
* 输出
* out.print();
* out.flush();
*/
static int ans=0;
static int N=9;//数组长度
static int[] nums = {1,2,3,4,5,6,7,8,9};//数组定义成全局变量
public static void main(String[] args) throws IOException {
dfs(0,8);
System.out.println(ans);
}
//from是数组交换位置的头指针(依次会+1),to是尾指针相当于哨兵的作用,当from==to的时候退出
static void dfs(int from ,int to){
if(from==to){ //递归的出口
countAns();
}else {
for (int i = from; i <= to ; i++) {
swap(from,i);
dfs(from+1,to);
//回溯恢复
swap(from,i);
}
}
}
static void swap(int a,int b){
int temp=nums[a];
nums[a]=nums[b];
nums[b]=temp;
}
static boolean isTrue(int n){
int[] count=new int[10];
int temp=0;
while (n!=0){
temp=n%10;
count[temp]++;
n=n/10;
}
for (int i = 1; i <= 9; i++) {
if(count[i]>1||count[i]==0){
return false;
}
}
return true;
}
static void countAns(){
int a;
int b;
StringBuilder s=new StringBuilder("");
for (int i = 0; i < N; i++) {
s.append(nums[i]);
}
String ss=s.toString();
int l=1;
while (l<=N/2) {
a=Integer.parseInt(ss.substring(0,l));
b=Integer.parseInt(ss.substring(l,N));
int temp=a*b;
if(isTrue(temp)){
ans++;
}
l++;
}
}
}
(这个题目调了好久,怪自己dfs生疏了)
全排列:递归+回溯
贴一个讲的蛮不错的视频:
全排列(递归)_哔哩哔哩_bilibili全排列(递归), 视频播放量 1200、弹幕量 0、点赞数 19、投硬币枚数 13、收藏人数 29、转发人数 5, 视频作者 走路太骚会闪腰lx, 作者简介 ,相关视频:『教程』什么是递归?,全排列问题 递归 编程演示,[PTA] 全排列 递归,[算法教程] 全排列,递归实现全排列算法,DFS-原理和全排列题,【python】递归与回溯-全排列(第二讲),DFS求全排列,递归实现全排列,全排列算法的递归实现https://www.bilibili.com/video/BV1aU4y1H7kL/?spm_id_from=333.788.recommend_more_video.-1&vd_source=eb072ba6b610daa77b0adfe79fcc5879
题目2:完全平方数
问题描述
一个整数 a 是一个完全平方数, 是指它是某一个整数的平方, 即存在一个 整数 b, 使得 a=b2。
给定一个正整数 n, 请找到最小的正整数 x, 使得它们的乘积是一个完全平方数。
输入格式
输入一行包含一个正整数 n 。
输出格式
输出找到的最小的正整数 x 。
样例输入 1
12
样例输出 1
3
样例输入 2
15
样例输出 2
15
评测用例规模与约定
对于 3030 的评测用例, 1≤n≤10001≤n≤1000, 答案不超过 1000 。
对于 6060 的评测用例, 1≤n≤1081≤n≤108, 答案不超过 108108 。
对于所有评测用例, 1≤n≤10121≤n≤1012, 答案不超过 10121012 。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码:
package 第十四届蓝桥杯三月真题刷题训练.day4;
import java.io.*;
import java.util.Scanner;
/**
* @author yx
* @date 2023-03-07 15:25
*/
public class 完全平方数 {
static PrintWriter out =new PrintWriter(System.out);
static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in=new StreamTokenizer(ins);
/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
*
* 输出
* out.print();
* out.flush();
*/
public static void main(String[] args) throws IOException {
Scanner scanner=new Scanner(System.in);
long n=scanner.nextLong();
long ans=n;
for (long i = 1; i <= Math.sqrt(n); i++) {
if(n%(i*i)==0){
ans=n/(i*i);
}
}
out.println(ans);
out.flush();
}
}