实验二 求400以内的smith数

package 实验二316;
//输出400以内的smith数, smith数是指满足一下条件的可分解的整数
// 所有位数上的数字和等于其全部素数因子的数字总和
// 9975 =3*5*5*19*7     9975的数字和 =因子的总数和=30   9+9+7+5 =他的因子 3 5 5 19 各位上面的和

import sun.security.mscapi.CPublicKey;
// 思路 首先求出数本身的和,让后求出因子的和 ,等于全部素数因子的数字总和

public class A2_23 {
    public static void main(String[] args) {
        int num1[] = new int[200];
        for (int i = 1; i <= 400; i++) {
            if (isPrime(i)) { // 素数不是smith数 。因为没有其他的因子

                continue; // 基础执行下一次的循环
            }
            int k = 0;
            int sum1 = 0; //所有的因子之和
            int sum2 = 0; // smith数所有位置上的和

            for (int j = 2; j < i; j++) {
                // 找2到i之间的素数  比如i等于22, j=11;
                if (i % j == 0) { // j是i的因子
                    if (isPrime(j)) { // 且j是素数
                        int[] temp = intTONumArray(j); // 将j中的数字存储到了数组里面 数组里面是两个11

                        for (int M = 0; M < temp.length; M++) { //1 1
                            num1[k++] = temp[M]; // nums1[1 ,1]

                        }   // 22的因子为素数的 还有一个为2

                        int tmpt = j * j; // tempt=11 *11;

                        //给大的数字 9975 3 5 5 19
                        while (i % tmpt == 0) {
                            //tempt 等于
                            for (int l = 0; l < temp.length; l++) {

                                //temp 里面 【3】
                                num1[k++] = temp[l];
                                tmpt *= j;
                            }
                        }
                    }
                }
            }
            for (int j = 0; j < k; j++) {
                sum1 += num1[j];
            }
            // 数字的本身求和
            sum2 = find(i);

            if (sum2 == sum1) {
                System.out.print(i + " ");
            }

        }

    }

    private static boolean isPrime(int i) {
        for (int j = 2; j < Math.sqrt(i); j++) {
            if (i % j == 0) {
                return false;
            }
        }
        return true;
    }

    public static int find(int n) {
        int shu = 0;
        int sum = 0;
        while (n != 0) {
            shu = n % 10; // 133 先得到3
            n /= 10; // n等于13
            sum += shu;
        }
        // System.out.println(sum);

        //求素数因子 如何去解决呢 ?   得多谢几个方法了


        return sum;
    }

    public static int[] intTONumArray(int n) {
        //String  str =Integer.toString(n);
        // 11传过来
        String str = String.valueOf(n);
        int[] nums = new int[str.length()]; //长度为2

        for (int i = 0; i < str.length(); i++) {
            nums[i] = Integer.parseInt(String.valueOf(str.charAt(i)));


        }
        //返回数组
        return nums;  //返回的数组里面有【1,1】

    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想要打 Acm 的小周同学呀

您的支持是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值