数论练习题——蓝桥杯

第一题:质因数分解

import java.util.Scanner;

public class Main{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
     Scanner sc= new Scanner(System.in);
     int n = sc.nextInt();
     int bak = n ; 
     int max= 0  ;

     //质因数分解   模版
      for(int i=2 ; i*i<=n;i++) {
          while(bak%i==0) {
              max=Math.max(max,i);
              bak/=i;
        
          }
      }
      if(bak>1)System.out.println(max>bak?max:bak);
    }

}

第二题:质数 

import java.util.Scanner;

public class Mian {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int count = 0 ; 
       for(int i =2 ;i<n;i++) {
           if(check(i) ) {
               System.out.print(i+" ");
               count++;
           }
       }
       System.out.println();
       System.out.println(count);
    }
    
    //判断素数
  static boolean check(int m ) {
       int bak = m ; 
      for(int i = 2 ; i*i <=m ; i++) {
          if(bak%i==0) return false;
          
      }
      return true;
  }
}

第三题:棋盘放麦子

import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        BigInteger big = new BigInteger("1");
        BigInteger sum  = BigInteger.valueOf(0);
        for(int i = 0 ; i <=62;i++) {
         big  = big.multiply(BigInteger.valueOf(2));
          sum= sum.add(big);
        }
        System.out.println(sum.add(BigInteger.valueOf(1)));
    }
}

第四题:等差数列

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int a[] = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        Arrays.sort(a);

        int max = a[a.length - 1];
        int min = 9999999;
       //找到公差
        for (int i = a.length - 1; i > 0; i--) {
            min = Math.min(min, a[i] - a[i - 1]);
        }

        if (min == 0) {
            System.out.println(n);
            return;
        }
     //n  = n (an-a1)/2+1(从0开始)
        System.out.println((max - a[0]) / min + 1);

    }
}

第五题:数数 

package 算法提高;

public class 数数001 {
	
	public static void main(String[] args) {
		int count =0 ;  
		for(int i = 2333333 ; i<= 23333333;i++) {
			  int bak = i ; 
			 int num = 1; 
			 int c = 0  ;
        //模板
			for(int j = 2; j<=bak/j;j++) {
				while(bak%j==0) {
					c++;
				  num*=j;
				  bak/=j;
				}
			}
			if(bak>1) {
				c++;
				num*=bak;
			}
			 if(c==12&&num==i) {
				 count++;
			 }
		}
		System.out.println(count);
	}
	
	

}


第六题:约数个数

public class Main {
    public static void main(String[] args) {
       int count =1,sum=0;
        int n= 1200000;
        int bak = n ; 
       for(int i = 2;i*i<=n;i++) {
           while(bak %i==0) {
               bak /=i;
               sum++;
              
           }
           count*=(sum+1);
           sum=0;
           
       }
       if(bak>1) count*=2;
       System.out.println(count);
    }

}

第七题:质数拆分


import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
 public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n=2019;
        int sum=1;
        //存方法个数
        long dp[][]=new long[400][2020];
        //存储质数
        int[] arry=new int[400];
        //从2遍历到2019的质数
        for(int i=2;i<2019;i++){
            if(zhishu(i)){
                arry[sum]=i;
                sum++;
            }    
        }
        //和为0时,相加的方法为1;
        dp[0][0]=1;
        //时间复杂度,306<2019
        //遍历质数,dp[0][0]已经被定义了,从1开始
        for(int i=1;i<sum;i++) {
            //遍历和等于0~2019的情况
            for(int j=0;j<2020;j++) {
                //质数大于和的时候,肯定不需要加入到加法中去,方法数不变
                dp[i][j]=dp[i-1][j];        
                //质数小于等于和的时候,加入到加法中去,方法数为:和为J时需要相加的加法数字中没有i的方法数(没有i)+和为J-arry[i]时
                //需要相加的加法数字中没有i的方法数(i带来的)
                if(arry[i]<=j) {
                    dp[i][j]=dp[i-1][j]+dp[i-1][j-arry[i]];
                }
            }
        }
        
        System.out.println(dp[sum-1][2019]);
    }
        //判断是否为质数-----除1和本身还有其他除数
        public static boolean zhishu(int a) {
            for(int i=2;i<a;i++) {
                if(a%i==0) {
                    return false;
                }
            }
        
            return true;
        }
}

第八题:合数个数


第九题:阶乘约数

package 打卡;

public class 阶乘约数 {
	
	public static void main(String[] args) {
		long sum = 1, count = 0;
	    int jc [] = new int[101];
		for (int i = 2; i <= 100; i++) {
			int bak = i;  //备份i
			for (int j = 2; j <= bak; j++) {
				while (bak % j == 0) {
					bak /= j;
				   jc[j]++;
				}
			}
		}
		for(int m  :jc) {
			sum*=m+1;
		}
	    System.out.println(sum);
	}
}

第十题:合数个数



import java.math.BigInteger;

import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
     Scanner sc =new Scanner(System.in);
     int n = sc.nextInt();
     BigInteger big = new BigInteger("1");
     
     for(int i = 1 ; i <=n;i++) {
     //用上一次的   和接下来的进行比较

       big = lcm(big,BigInteger.valueOf(i));
     }
      System.out.println(big.toString());
	}
	
	
	static BigInteger lcm(BigInteger  a ,  BigInteger b ) {
		return a.multiply(b).divide(a.gcd(b));
	}
}

第十一题:找素数

package fytyfytyu;

public class 找素数 {

	public static void main(String[] args) {
		int count = 0;
		for (int i = 2; i <= 1000000000; i++) {

			if ((i > 10) && (i % 2 == 0 || i % 3 == 0 || i % 7 == 0 || i % 5 == 0))// 进行剪枝
				continue;
			if (check(i)) {
				count++;
				System.out.println("i=" + i + ",count=" + count);

				if (count == 100002) {
					System.out.println(i);
					return;
				}
			}

		}

	}

	static boolean check(int n) {
		for (int i = 2; i * i <= n; i++) {
			if (n % i == 0)
				return false;
		}
		return true;
	}

}


第十二题 : 纯质数 

package 最新.java11届国赛;

public class 纯质数 {
    public static void main(String[] args) {
    	int count = 0 ;  
    	for(int i = 2 ; i <= 20210605;i++) {
    		if((i>10)&&(i%2==0||i%3==0||i%5==0||i%7==0))  continue;
    		if(check(i)&&isNum(i)) {
    			System.out.println(i);
    			count++;
    		}
    		
    	}
    	System.out.println(count);
	}
    
    static boolean check(int n  ) {
     
       for(int i = 2 ; i*i<=n;i++) {
    	   if(n%i==0) return false;
       }
    	return true;
    	
    	
    }
    
   static boolean isNum(int n ) {
	    String str = n + ""; 
	     String ff = "486901";
	    for(int i = 0 ; i <str.length();i++) {
           if(ff.contains(str.charAt(i)+"")) return false;
	    }
	  
	   return true;
	    
   }
    
}

第十三题:核桃的数量

import java.util.*;
public class Main {
    // 求 a 和 b 的最大公约数
    public static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }

    // 求 a 和 b 的最小公倍数
    public static int lcm(int a, int b) {
        return a * b / gcd(a, b);
    }

    // 求三个数的最小公倍数
    public static int lcm(int a, int b, int c) {
        return lcm(lcm(a, b), c);
    }

    public static void main(String[] args) {
       Scanner sc =new Scanner (System.in);
          int a = sc.nextInt(), b = sc.nextInt(), c=sc.nextInt();
        System.out.println(lcm(a, b, c)); // 输出:12
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值