系列专栏:蓝桥杯
个人主页:个人主页
目录
1.判断素数
2.大整数
3.求n的约数个数
4.数学归纳法
5.阶乘之和
素数的定义
素数又称质数,一个大于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:欧拉筛法
感兴趣的小伙伴看这篇文章
在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
例如:求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 即可。
图示:
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);
}
}
嘿嘿嘿,和高中数学很像。
其核心思想:一个个列举,找出规律,然后用代码实现。
输入一个数,判断这个数能不能用互不相等的非负整数的阶乘的和来表示,例如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("无解");
}
}