day22

好像是第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;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

螺上螺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值