【精选】JAVA入门算法题(二)

版权声明:很高兴认识你,我叫邵龙飞 原创文章,转载请注明 https://blog.csdn.net/qq_37482202/article/details/84709531

时时要有危机意识。别以为你命好运也好。

1.题目:打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。

例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。

题非常简单,只要用for循环,取出数的个位、十位、百位差不多就完成了

 for (int i=100;i<1000;i++){
            int a=i/100;
            int b=i/10%10;
            int c=i%10;
            if (i==a*a*a+b*b*b+c*c*c){
                System.out.println(i);
            }
        }

2.题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。

例如6=1+2+3。编程找出1000以内的所有完数。

这道题呢,我们只需要在之前找素数的程序上稍加修改就好了

int sum;
        for (int i=1;i<1000;i++){
            sum=0;
            for (int j=1;j<i;j++){
                if (i%j==0){
                    sum+=j;
                }
            }
            if (sum==i){
                System.out.println(i);
            }
        }

我们还可以借用一下数学的帮助,凡是一个数开方后的数的素数都是原来那个数的素数,至于最后的加一是因为循环是从2开始的,1是任何数的因数

int sum;
        for (int i=2;i<1000;i++){
            sum=0;
            int sqrt=(int)Math.sqrt(i+1);
            for (int j=2;j<=sqrt;j++){
                if (i%j==0){
                    sum+=j;
                    sum+=i/j;
                }
            }
            if (sum+1==i){
                System.out.println(i);
            }
        }

3.题目:求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。

例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加有键盘控制。

看到这道题的第一时间想到的思路便是拼接字符串,字符串转数字,求和

Scanner scanner=new Scanner(System.in);
        String a=scanner.nextInt()+"";
        int number=scanner.nextInt();
        int result=0;
        for (int i=1;i<=number;i++){
            String s="";
            for (int j=1;j<=i;j++){
                s+=a;
            }
            result+=Integer.valueOf(s);
        }
        System.out.println("结果:"+result);

而后仔细琢磨一下,发现一个规律,每个数都等于前面一个数乘10再加上它本身

 Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        int number=scanner.nextInt();
        int result=a;
        int t=a;
        for (int i=1;i<number;i++){
            t=t*10;
            t+=a;
            result+=t;
        }
        System.out.println("结果:"+result);

换一个思路,那这个数列都是原数字乘上1,11,111,1111这样的一个数列,我们可以构造一个这样的数列,然后想乘求和

 Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        int number=scanner.nextInt();
        int result=0;
        int t=0;
        for (int i=1;i<=number;i++){
            t+=Math.pow(10,i-1);
            System.out.println(t);
            result+=a*t;
        }
        System.out.println("结果:"+result);

4.题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

这道题非常简单,主要是明确两个概念,什么是最大公约数,什么是最小公倍数。

最大公约数:两个数共有的最大因子

最小公倍数:两个数共有的最小的倍数

找最大公约数从大数找到小数,找最小公倍数从小数找到大数

两个数最大的公约数最大也就是两种中较小的那个数,最小就是1

两个数最小的公倍数最小就是两数中较大的那个数,最大就是两数想乘的结果

  Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        int b=scanner.nextInt();
        for(int i=(a<b?a:b);i>=1;i--){
            if (a%i==0&&b%i==0){
                System.out.println("最大公约数:"+i);
                break;
            }
        }
        for (int i=(a>b?a:b);i<=a*b;i++){
            if (i%a==0&&i%b==0){
                System.out.println("最小公倍数:"+i);
                break;
            }
        }

借助一下数学思维,我们只需要求出两个数共有的因数和各自最大的因数,这些数的乘积就等于两数的最小公倍数

private static void Method2() {
        Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        int b=scanner.nextInt();
        getPrimeFactor(a,b);
        int min=1;
        System.out.println(integerList);
        for (int i:integerList){
            min*=i;
        }
        System.out.println("最小公倍数:"+min);
    }
    private static void getPrimeFactor(int number1 , int number2 ) {
        for (int i=2;i<=(number1>number2? number1:number2);i++){
            if (number1%i==0&&number2%i==0){
                integerList.add(i);
                getPrimeFactor(number1/i,number2/i);
                break;
            }
            if (i==number1||i==number2){
                integerList.add(number1);
                integerList.add(number2);
            }
        }
    }

还可以不断对较小的那个数取余,直到取到余数为0,此时的数就是两个数的最大公约数,用两数想乘的结果除以这个结果便是最小公倍数了

private static void Method3() {
        int a,b,m,n;
        Scanner in=new Scanner(System.in);
        System.out.println("请输入一个正整数:");
        a=in.nextInt();
        System.out.println("再输入一个正整数:");
        b=in.nextInt();
        m=commonDivisor((a>b? a:b),(a<b? a:b));
        n=a*b/m;
        System.out.println("最大公约数:"+m);
        System.out.println("最小公倍数:"+n);
    }

    public static int commonDivisor(int x,int y){
        while(y!=0){
            int k=x%y;
            x=y;
            y=k;
        }
        return x;
    }

猜你喜欢

转载自blog.csdn.net/qq_37482202/article/details/84709531