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

Posted 兴奋的大公狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯-2/14天-完全平方数另类思路相关的知识,希望对你有一定的参考价值。

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

题目

问题描述
一个整数 aa 是一个完全平方数, 是指它是某一个整数的平方, 即存在一个 整数 bb, 使得 a=b^2a=b2
给定一个正整数 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;
        
    

蓝桥杯每日一真题—— [蓝桥杯 2021 省 AB2] 完全平方数(数论,质因数分解)

文章目录

[蓝桥杯 2021 省 AB2] 完全平方数

题目描述

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

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

12

样例输出 #1

3

样例 #2

样例输入 #2

15

样例输出 #2

15

提示

对于 30 % 30 \\% 30% 的评测用例, 1 ≤ n ≤ 1000 1 \\leq n \\leq 1000 1n1000,答案不超过 1000 1000 1000

对于 60 % 60 \\% 60% 的评测用例, 1 ≤ n ≤ 1 0 8 1 \\leq n \\leq 10^8 1n108,答案不超过 1 0 8 10^8 108

对于所有评测用例, 1 ≤ n ≤ 1 0 12 1 \\leq n \\leq 10^12 1n1012,答案不超过 1 0 12 10^12 1012

蓝桥杯 2021 第二轮省赛 A 组 G 题(B 组 H 题)。

思路:

这一看直接暴力就只能得一点点分,我还数论学的不太好先暴力得了30分。然后开始想办法吧!
没办法。。。看答案吧。。。

理论补充:完全平方数的一个性质:完全平方数的质因子的指数一定为偶数

1.唯一分解定理任意一个数 n,它都可以分解为若干个质数的乘积。

2.需要知道完全平方数的一个性质:完全平方数的质因子的指数一定为偶数。附上大佬的证明过
程:

最终思路:

对n进行质因数分解,如果质因数的指数为奇数的话就在x中乘以这个质因子这样,可以让指数保持偶数,如果是偶数那就不用管它~~~~
1.分解质因子:

for (long long i = 2; i * i <= n; i++)
    
        if (n % i == 0)
        
            cnt++;//记录有多少个因子,后面好遍历
        

        while (n % i == 0)
        
            a[cnt] = i;//a数组存因子
            g[cnt]++;//g数组存因子指数
            n = n / i;
        
    

    if (n > 1)
    
        a[++cnt] = n;
        g[cnt]++;
    //考虑没分解完的情况

2,根据性质得出答案:

  for (int i = 1; i <= cnt; i++)//遍历如果有奇数就让原来的n*ans*这个奇数质因子也就是让ans*这个奇数质因子
    
        if (g[i] % 2)
        
            ans = ans * a[i];
        
    
    cout << ans;

小插曲:

质因数分解写错了最后输出了和n一样的数竟然得了60分!!

全部代码

#include <iostream>
using namespace std;

long long n, ans = 1, g[1000], a[1000], cnt;
int main()

    cin >> n;
    // 首先对n进行质因数分解
    for (long long i = 2; i * i <= n; i++)
    
        if (n % i == 0)
        
            cnt++;//记录有多少个因子,后面好遍历
        

        while (n % i == 0)
        
            a[cnt] = i;//a数组存因子
            g[cnt]++;//g数组存因子指数
            n = n / i;
        
    

    if (n > 1)
    
        a[++cnt] = n;
        g[cnt]++;
    //考虑没分解完的情况
    //完全平方数的质因子的指数一定为偶数
    for (int i = 1; i <= cnt; i++)//遍历如果有奇数就让原来的n*ans*这个奇数质因子也就是让ans*这个奇数质因子
    
        if (g[i] % 2)
        
            ans = ans * a[i];
        
    
    cout << ans;
    system("pause");
    return 0;


以上是关于蓝桥杯-2/14天-完全平方数另类思路的主要内容,如果未能解决你的问题,请参考以下文章

第十二届蓝桥杯 ——完全平方数

第十二届蓝桥杯 ——完全平方数

第十二届蓝桥杯 ——完全平方数

蓝桥杯国赛---平方拆分(dfs)

蓝桥杯国赛---平方拆分(dfs)

第十四届蓝桥杯三月真题刷题训练——第 22 天