Java经典算法编程(素数相关)

第一次写博客,新手,自己找的几道算法编程,错误之处还望指正。

Java经典算法编程

 

1素数(质数)指的是不能被分解的数,除了1和它本身之外就没有其他数能够整除。求100以内的所有素数。

2若两个素数之差为2,则这两个素数就是孪生素数。编写程序找出1~100之间的所有孪生素数。

3编写程序找出1~900之间的所有可逆素数(可逆素数是指一个素数的各位数值顺序颠倒后得到的数仍为素数,如113311)。

4回文素数问题的求解:

所谓回文素数是指,对一个整数n从左向右和从右向左读的结果值相同且是素数,即称为回文素数。

求不超过1000的回文素数。

5平方回文素数问题的求解:

素数的平方是回文数,比如素数11*11=121。求不超过1000的回文素数。

6相亲数问题的求解

220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284

284的真因数之和为1+2+4+71+142=220

毕达哥拉斯把这样的数对AB称为相亲数:A的真因数之和为B,而B的真因数之和为A。求100000以内的相亲数。

 


import sun.org.mozilla.javascript.internal.regexp.SubString;

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        Main main = new Main();
        long start = System.currentTimeMillis();
       // main.printSushu(100);
        main.printDouble(100);
        main.printGoback(900);
        main.printHuiwen(1000);
        main.printSqure(1000);
        long end = System.currentTimeMillis();
        System.out.println();
        System.out.println("计算用时共"+(end-start)+"ms");
    }
    /**
     * Java经典算法编程

     1、素数(质数)指的是不能被分解的数,除了1和它本身之外就没有其他数能够整除。求100以内的所有素数。
     2、若两个素数之差为2,则这两个素数就是孪生素数。编写程序找出1~100之间的所有孪生素数。
     3、编写程序找出1~900之间的所有可逆素数(可逆素数是指一个素数的各位数值顺序颠倒后得到的数仍为素数,如113311)。
     4、回文素数问题的求解:
     所谓回文素数是指,对一个整数n从左向右和从右向左读的结果值相同且是素数,即称为回文素数。
     求不超过1000的回文素数。
     5、平方回文素数问题的求解:
     素数的平方是回文数,比如素数11*11=121。求不超过1000的回文素数。
     6、相亲数问题的求解
     220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284
     284的真因数之和为1+2+4+71+142=220
     毕达哥拉斯把这样的数对AB称为相亲数:A的真因数之和为B,而B的真因数之和为A。求100000以内的相亲数。

     */
    public ArrayList<Integer> printSushu(int num){
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        int i =2,j=1,count=0,arrNum=0;
        while (i<=num){
            while (j<=i){
                if (i%j==0){
                    count++;
                }
                j++;
            }
            if (count==2){
                System.out.print(i+",");
                arrayList.add(arrNum,i);
                arrNum++;
            }
            j=1;
            count=0;
            i++;
        }
        System.out.println("");
        return arrayList;
    }
    public void printDouble(int num){
        ArrayList<Integer> list = printSushu(num);
        System.out.println(num+"以内孪生素数对有:");
        int i=1;
        while (i<list.size()){
            if (list.get(i)-list.get(i-1)==2)
                System.out.print("["+list.get(i-1)+","+list.get(i)+"]");
            i++;
        }
    }
    public void printGoback(int num){
        ArrayList list = printSushu(num);
        int i =0;
        System.out.println(num+"以内可逆素数有:");
        while (i<list.size()){
            int isGoback = (int) list.get(i);
            if (judge(isGoback)){
                System.out.print(isGoback+",");
            }
            i++;
        }
    }
    public boolean judge(int num){
        int newNum = num;
        int numLength = String.valueOf(num).length();
        int[] split = new int[numLength];
        int count = numLength;
        int[] newSplit = new int[split.length];
        for (int i = 0;i<numLength;i++){
            split[i]= (int) (newNum/Math.pow(10,count-1));
            newNum=newNum-(split[i]*(int) (Math.pow(10,count-1)));
            count--;

        }
        for (int j=0;j<split.length;j++){
            newSplit[j]=split[split.length-j-1];
        }
        int time=0,goBackNum=0;
        while (time<numLength){
            goBackNum+=newSplit[time]*Math.pow(10,numLength-time-1);
            time++;
        }
        int whole=0;
        for (int k=1;k<goBackNum;k++){
        if (goBackNum%k==0)
            whole++;
        }
        if (whole==1)
            return true;
        return false;
    }
    public void printHuiwen(int num){
        ArrayList huiwenList=printSushu(num);
        System.out.println(num+"以内回文素数有:");
        for (int i=0;i<huiwenList.size();i++){
            int huiwenBit=0;//回文数位数
            int huiwenNum = (int) huiwenList.get(i);
            for (int j=0 ;j<huiwenNum;j++){
                if (huiwenNum>=Math.pow(10,j)&&huiwenNum< Math.pow(10,j+1)){
                    huiwenBit=j+1;
                    break;
                }
            }
            int[] huiwenArr=new int[huiwenBit];
            for (int j=0;j<huiwenBit;j++){
                String huiwenStr=String.valueOf(huiwenNum);

                huiwenArr[j]= Integer.parseInt(huiwenStr.substring(j,j+1));
            }
            String afterNUm="";
            for (int j=huiwenBit;j>0;j--){
                afterNUm+=String.valueOf(huiwenArr[j-1]);
            }
            if (String.valueOf(huiwenNum).equals(afterNUm))
                System.out.print(huiwenNum+",");
        }
        System.out.println();
    }
    public void printSqure(int num){
        System.out.print(num+"以内平方回文素数有:");
        int squreNum;
        ArrayList squreList = printSushu(num);
        for (int i=0;i<squreList.size();i++){
            squreNum= (int) Math.pow((int) squreList.get(i),2);
            if (isHuiwen(squreNum)){
                System.out.print(squreList.get(i)+"*"+squreList.get(i)+"="+squreNum+",");
            }
        }
    }
    public boolean isHuiwen(int num){
       int tempNum = num;
       int sum=0;
       int numBit=String.valueOf(num).length();
       int tempBit = numBit;
       int[] numArr=new int[numBit];
       for (int i=0;i<numBit;i++){
           numArr[i]= (int) (tempNum/Math.pow(10,tempBit-1));
           tempNum= (int) (tempNum-numArr[i]*Math.pow(10,tempBit-1));
           tempBit--;
       }
       for (int i=numArr.length-1;i>=0;i--){
           sum+=numArr[i]*Math.pow(10,i);
       }
       if (sum==num)
           return true;
        return false;

    }

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值