好像是第22天了,我测你mma,准备寄了,不小心说藏话了,
今天写了四题,求表扬!!!!!!!
2.完全平方数
30%的阳历
package daka;
import java.util.*;
/*
*
* 完全平方数
* n 输出 m n*m是平方数
*
*/
public class wanqunbf {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n =sc.nextInt();
ArrayList<Integer> list = new ArrayList<>();
for(int i=1;i<=n;i++) {
for(int y=1;y<=n;y++) {
if(i * n == y * y) {
list.add(i);
break;
}
}
}
int ans = list.get(0);
System.out.println(ans);
}
}
40%
package daka;
import java.util.*;
/*
*
* 完全平方数
* n 输出 m n*m是平方数
*
*/
public class wanqunbf {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Long n = sc.nextLong();
if(isji(n)) {
System.out.println(n);
return;
}
ArrayList<Long> list = new ArrayList<>();
for(Long i=1l;i<=n;i++) {
for(Long y=1l;y<=n;y++) {
if(i * n == y * y) {
list.add(i);
break;
}
}
}
Long ans = list.get(0);
System.out.println(ans);
}
private static boolean isji(long num) {
if(num >0 && num % 2 ==1) {
return true;
}
return false;
}
}
100%
package daka;
import java.util.*;
/*
*
* 完全平方数
* n 输出 m n*m是平方数
*
*/
public class wanqunbf {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Long n = sc.nextLong();
long ans =0l;
for(long i =1;i * i <= n;i++) {
if(n % (i*i) == 0) {
ans = n / (i * i);
}
}
System.out.println(ans);
}
}
1.123
package daka;
import java.util.*;
/* 123数列
* 11 12 123 1234
* 求数列中连续的一段的和
* 求二维拆分和数组前缀和
* 块号:1 2 3 4
* 1 12 123 1234
* 块:1 3 6 10
* 前缀和:1 4 10 20
*/
public class shulie123 {
static long[] a = new long[1414220];
static long[] b = new long[1414220];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long t = sc.nextLong();
for(int i=1,k=1;i<b.length;i++,k++){
a[i] = a[i-1] + k;//第i个分块的长度,i数字在第几个分块中
b[i] = b[i-1] + a[i];//前缀和,前i个分块的所有数字的总和
}
for(int i=0;i<t;i++) {
long l = sc.nextLong();
long r = sc.nextLong();
long sum = fun(r) - fun(l-1);
System.out.println(sum);
}
}
//求和
private static long fun(long t) {
if(t==0) {
return 0l;
}
int row = binarySearch(t);//查找所在的行
long n = t- a[row];//所查找的位置 - 行数的前缀和 = row +1 前面的个数
return n * (n+1) / 2 + b[row];//row + 1 行的和 + 前面的b的前缀和 = t的和
}
//二分
private static int binarySearch(long t) {
//查找下标
int l =0;int r =1414220;
while(l<=r) {
int mid = ( l + r)>>1;
if(a[mid] < t) {
l = mid+1;
}else {
r = mid-1;
}
}
//返回上一行
return l - 1;
}
}
3.受伤的皇后
package DFSxt;
import java.util.*;
/*受伤的皇后
* 不在同一行同一列,对角线上的行号差值至少为3
*
*
*/
public class sshuanghou {
static int n;
static int [] a =new int [100];
static int sum;
// 我们模拟每一行,所以不在同一列或同一对角线上即可
private static boolean check(int r,int c) {
//模拟行号
for(int i=0;i<r;i++) {
//当前位置列号和已有皇后的列号相同
//当前位置的行号减去已有皇后行号 == 当前位置的列号减去已有皇后的列号(对角线)
if(a[i] == c || Math.abs(r - i) == Math.abs(c-a[i])) {
return false;
}
}
return true;
}
private static void dfs(int r) {
if(r == n) {//边界
sum++;
}
//模拟第r行中的每一列(寻找对应的第c列)
for(int c =0;c<n;c++) {
if(check(r,c)) {
a[r] = c;//当前行的第c列摆放皇后
dfs(r+1);//模拟当前位置的下一行
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
dfs(0);//递归从第0行开始摆放
System.out.println(sum);
sc.close();
}
}
4.求阶乘
package daka;
import java.util.*;
/*求阶乘
* N!末尾恰好有k个0的最小N
* 不存在输出-1
* 2
* 10(10! 3628800)
*
* 求末尾有几个0的数 即求该数的阶乘因子中5的个数,5!阶乘因子含有一个5,10!阶乘因子含有2个5
* 1 : 5! 2 :10!(5! * 6 *...9 (* 2 * 5)) 3 : 15!
*
*/
public class jiechen {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long k =sc.nextLong();
long l = 1l;
long r = Long.MAX_VALUE - 1;
while(l<r) {
long mid = (l+r)>>1;
if(k<=calc(mid)) {
r = mid;//r为阶乘的末尾
}else {
l = mid+1;//l为阶乘的头部
}
}
//求r阶乘末尾个数不低于k
if(calc(r) !=k) {
System.out.println(-1);
}else {
System.out.println(r);//r作为阶乘的末尾
}
sc.close();
}
//求某个数的阶乘因子中5的个数
private static long calc(long x) {
long res =0;
while(x !=0) {
res = res + x / 5;
x /=5;
}
return res;
}
}