蓝桥杯-2/14天-完全平方数【另类思路】

蓝桥杯中一些题本身比较难,我们可以换种思路,能拿多少拿多少,比如这道题,拿个一半的分数也不错

题目

问题描述

一个整数 aa 是一个完全平方数, 是指它是某一个整数的平方, 即存在一个 整数 bb, 使得 a=b^2a=b

给定一个正整数 nn, 请找到最小的正整数 xx, 使得它们的乘积是一个完全平 方数。

输入格式

输入一行包含一个正整数 nn

输出格式

输出找到的最小的正整数 xx

样例输入 1

12

样例输出 1

3

样例输入 2

15

样例输出 2

15

运行限制

最大运行时间:1s

最大运行内存: 256M

思路

看了一圈大佬的答案实在看不懂,有点神奇,但比赛不会做我们也可以用暴力累加,多少拿点分

我的笨鸟思路:

完全平方数开根一定是一个整数,所以,我们可以把它当做字符串来思考,判断开根后的数的小数点后的位数,如果<=1(因为比如100,用Math.sqrt(100)=10.0)返回的结果小数点后只有1位,而Math.sqrt(3)这种数开根后就是一长串了,所以只要字符串中小数点后只有一位,那肯定就是答案

因为Math.sqrt()的结果是一个浮点数,所以我们可以用将其转为String,然后用split()方法,参数是一个正则表达式,也简单,就是”\.”,因为小数点‘.’是特殊字符,所以需要转义字符,split(“\.”)的意思就是以“.”做分隔的标志,把小数点前后分隔开来返回一个String数组,我们只需要判断小数点后面的那个字符串就好

代码

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
       Scanner input = new Scanner(System.in);
       long  n = input.nextLong();
        System.out.println(minP(n));
 
    }
    public static long minP(long num){
        double n = Math.round(Math.sqrt(num));//3
        long i=2;
        if (Math.sqrt(num) == n){
            return 1;
        }else {//能被整除说明找到最小
            while(!ifZhengChu(Math.sqrt(num*i)+"")){
                i++;
            }
        }
        return i;
    }
    //判断是不是整数
    public static boolean ifZhengChu(String str){
        String[] strings = str.split("\.");
        String check = strings[1];
        if (check.length()<=1){
            return true;
        }else {
            return false;
        }
    }
}


发表评论