【LEETCODE】【史密斯数】

该博客主要探讨了如何实现寻找大于等于给定数的最小史密斯数的算法。通过输入整数n和一系列数字num,程序利用暴力枚举和质因数分解的方法,检查每个数字是否为史密斯数,直到找到符合条件的数为止。涉及到的编程概念包括质因数分解、判断质数、计算数字和以及循环条件判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【LEETCODE】【史密斯数】


题目描述
Simth数的概念:一个非素数,其各位之和等于其所有质因数的各位之和。例如:
4=2 2,4=2+2,所以4是一个史密斯数。
22=2
11,2+2=2+1+1,22也是一个史密斯数。
27=3 33,2+7=3+3+3,27也是一个史密斯数。

解答要求
时间限制:1000ms, 内存限制:100MB
输入
第一行输入一个整数n(1<n<200),表示有n组测试数据。
接下来每行一个数num(1<=num<=5000000)。

输出
对于输入的每一个num,输出大于等于num的最小的史密斯数。

样例
输入样例 1 复制

3
3
4
4937774
输出样例 1

4
4
4937775
提示样例 1

提示
从给出的数开始递增,暴力判断就行。

public static void main(String[] args) {
        // please define the JAVA input here. For example: Scanner s = new Scanner(System.in);
        Scanner s = new Scanner(System.in);
        long n=s.nextLong();
        for(long i=0;i<n;i++){
            long num=s.nextLong();
            while(true){
                if(isSimthDigit(num)){
                    System.out.println(num);
                    break;
                }
                num++;
            }
        }
        // please finish the function body here.
        // please define the JAVA output here. For example: System.out.println(s.nextInt());
    }

    public static boolean isSimthDigit(long num){
        long sumRight=0;
        long sumLeft=0;
        long temp=num;
        if(isPrime(num)){
            return false;
        }
        //分解质因数
        for(long i=2;i<=temp;i++){
            if (temp%i==0){
                if(i<10){
                    sumRight+=i;
                }else
                {
                    sumRight+=getSum(i);
                }
                temp/=i;
                i=1;
            }
        }
        sumLeft=getSum(num);
        if(sumLeft==sumRight){
            return true;
        }
        return false;
    }
    public static boolean isPrime(long num) {
        for (long i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
    public static long getSum(long num){
        long sum=0;
        while(num>=10){
            sum+=num%10;
            num/=10;
        }
        return sum+num;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值