【蓝桥杯-筑基篇】基础数学思维与技巧(2)

系列专栏:蓝桥杯

个人主页:个人主页

目录

1.判断素数

2.大整数

3.求n的约数个数

4.数学归纳法

5.阶乘之和


1.判断素数

素数的定义

素数又称质数,一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数,否则称为合数(规定1既不是素数也不是合数)

方法1:

遍历从2到n-1的所有数字,判断是否有可以被n整除的数,如果没有,则为素数。

import java.util.Scanner;
public class A {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要判断的数字:");
        int n = sc.nextInt();
        int i = 0;
 
        for ( i = 2; i <= n-1 ; i++) {
            if(n % i == 0){
                System.out.println(n+"不是素数");
                break;
            }
        }
        if(i == n){
            System.out.println(n+"是素数");
        }
    }
}

方法2:

判定的范围改为[2 -,n/2]。当 i>n/2 时,则判定为素数。

import java.util.Scanner;
public class A {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要判断的数字:");
        int n = sc.nextInt();
        int i = 0;
 
        for ( i = 2; i <= n/2 ; i++) {
            if(n % i == 0){
                System.out.println(n+"不是素数");
                break;
            }
        }
        if(i > n/2){
            System.out.println(n+"是素数");
        }
    }
}

方法3:

在Java中判定素数的范围也可以到sqrt(n),(对n开平方)。对应的函数为:Math.sqrt(n)

	    public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入要判断的数字:");
        while(sc.hasNext()) {
            int n = sc.nextInt();
            int i = 2;
            for(;i <= Math.sqrt(n);i++){
                if(n % i == 0){
                    System.out.println(n+"不是素数");
                    break;
                }
            }
            if(i >Math.sqrt(n)){
                System.out.println(n+"是素数");
            }

        }
		
	}

方法4:埃氏筛法

感兴趣的小伙伴看这篇文章

方法5:欧拉筛法

感兴趣的小伙伴看这篇文章

2.大整数

在java中范围最大的基本数据类型是long,它可表示的范围是-2的63次方  到 2的63次方-1。当我们遇到要表示的数超过了该范围时就必须使用BigInteger类。

比如我们要计算n的阶乘。

BigInteger类的创建:

BigInteger bigInteger = new BigInteger("1");

自定义进制:

BigInteger bigInteger = new BigInteger("1001",2);//2为二进制
	    	System.out.println(bigInteger);//输出9

BigInteger类的运算:

加法:

BigInteger a = new BigInteger("10");
BigInteger b = new BigInteger("2");
BigInteger add = a.add(b);// 加法
System.out.println(add);//12

减法:

BigInteger subtract = a.subtract(b); // 减法
System.out.println(subtract);//98

乘法:

BigInteger multiply = a.multiply(b); // 乘法
System.out.println(multiply);//200

除法:

BigInteger divide = a.divide(b); // 除法
System.out.println(divide);//50

取余:

BigInteger mod = a.mod(b); // 取余(只返回正数)
System.out.println(mod);//0

3.求n的约数个数

例如:求36 的约数

因为:1*36=36,2*18=36,3*12=36,4*9=36,6*6=36

故36的约数为:1,36,2,18,3,12,4,9,6

总共:9个

方法1:暴力枚举

	    public static void main(String[] args) {
	    	Scanner scanner=new Scanner(System.in);
	    	while(scanner.hasNext()) {
	    		int n=scanner.nextInt();
	    		int count=0;
	    		for (int i = 1; i <= n; i++) {
					if(n%i==0) {
						count++;
					}
				}
	    		System.out.println(count);	
	    	}


	}

方法2:

由原来i=1  到 i=n  列举 ,变为  i=1  到 i=n/2。

以36举例,36/2=18   18之后的 19 20  21 22 一直到35 都不是36的约数,只有36是。

故此 只需要求出   n/2之前的 约数数量 然后加1 即可。

图示:

【蓝桥杯-筑基篇】基础数学思维与技巧(2)_第1张图片

	    public static void main(String[] args) {
	    	Scanner scanner=new Scanner(System.in);
	    	while(scanner.hasNext()) {
	    		int n=scanner.nextInt();
	    		int count=0;
	    		for (int i = 1; i <= n/2; i++) {
					if(n%i==0) {
						count++;
					}
				}
	    		System.out.println(count+1);	
	    	}


	}

4.数学归纳法

【蓝桥杯-筑基篇】基础数学思维与技巧(2)_第2张图片

 嘿嘿嘿,和高中数学很像。

其核心思想:一个个列举,找出规律,然后用代码实现。

5.阶乘之和

输入一个数,判断这个数能不能用互不相等的非负整数的阶乘的和来表示,例如9=1!+2!+3!.

思路:

把0到10的阶乘都算出来 然后用数组存取,从10的阶乘开始,一直的比较然后不断的相减,看最后number 是否等于0,为0则是可以的,否则就不行。

	    public static void main(String[] args) {

	    	int arr[]= new int[10];//arr数组用于存阶乘
	    	int fac=1;
	    	for (int i = 1; i <=10; i++) {
				fac=fac*i;
				arr[i-1]=fac;
			}
//	    	System.out.println(Arrays.toString(arr));
	    	Scanner scanner=new Scanner(System.in);
	    	while(scanner.hasNext()) {
	    		int number=scanner.nextInt();
	    		
	    		if(number<0) {
					System.out.print("no");
				     break;
				}
	    		
	    		for (int i =arr.length-1 ; i >=0 ; i--) {
					
					if(number>=arr[i]) {
						number=number-arr[i];
					}
				
				}
	
				if(number==0) {
					System.out.println("yes");
				
				}
				else System.out.println("无解");
	    
	    	}
	    	


	}

你可能感兴趣的:(蓝桥杯,蓝桥杯,职场和发展,算法)