首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >检查一个数字是否是Smith数字

检查一个数字是否是Smith数字
EN

Code Review用户
提问于 2017-12-20 22:27:09
回答 2查看 1.9K关注 0票数 3

我创建了一个Java程序来检查用户输入的数字是否是史密斯数 (一个数字之和等于其素数分解的数字之和)。该程序运行良好,但要检查4937775这样的数字需要太长时间。如何减少它执行所需的时间?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.*; 
class check
{
    static boolean a;
    static boolean checkprime(long n)
    {
        int i, factors= 0; 
        for(i = 1;i<=n ;i++)
        {
            if(n%i==0)
                factors++;
        }
        if(factors == 2)
            return true;
        else
            return false; 
    }

    static long sumfinder(long  n)
    {
        long  sum = 0; 
        while(n!=0)
        {
            sum = sum + n%10; 
            n= n/10; 
        }
        return sum; 
    }

    static boolean checksmith(long  n)
    {
        long  sum = 0; 
        if(checkprime(n)== true)
        { 
            System.out.println(n + " is a prime number ");
            return false; 
        }
        else
        {
            System.out.println(n + " is not  a prime number ");
            //generate prime factors: 
            long  num = n; 

            outer: 
            for(long  i = 1; i<= num ; i++)
            {
                if(checkprime(i)== true)
                {

                    if(num%i== 0)
                    {
                        sum= sum+ sumfinder(i); 
                        num = num/i; 
                        i = 1;
                        if (num == 1)
                        {
                            break outer; 
                        }
                    }
                }
            }
        }

        System.out.println(sum);
        System.out.println(sumfinder(n));

        if (sumfinder(n)== sum)

            return true; 

        else
            return false;
    }

    static void display()throws InputMismatchException
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter a number");
        long  n = sc.nextInt(); 
        if(checksmith(n)== true)
        {
            System.out.println("Smith number");

        }
        else
            System.out.println("Not a Smith number");
    }

    public static void main(String [] args)
    {
        display(); 
    }
}
EN

回答 2

Code Review用户

发布于 2017-12-21 04:14:17

若要分解整数,只需在2sqrt(num)之间循环因子即可。如果n是素数,那么num现在将等于n。如果num现在不是1,那么它也是一个主要因素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.*;
class Check {
    static long sumDigits(long n) {
        long sum = 0;
        while (n != 0) {
            sum += n % 10;
            n /= 10;
        }
        return sum;
    }

    static boolean checkSmith(long n) {
        long sum = 0, num = n;
        for (long i = 2; i * i <= num; i++) {
            while (num % i == 0) {
                // i is a prime here
                sum += sumDigits(i);
                num /= i;
            }
        }
        if (n == num && n > 1) {
            System.out.println(n + " is a prime number");
            return false;
        }
        System.out.println(n + " is not a prime number");
        if (num > 1) {
            // num is a prime here
            sum += sumDigits(num);
        }

        System.out.println(sum);
        System.out.println(sumDigits(n));

        return sumDigits(n) == sum;
    }

    static void display() throws InputMismatchException {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter a number:");
        long n = sc.nextLong();
        if (checkSmith(n))
            System.out.println("Smith number");
        else
            System.out.println("Not a Smith number");
    }

    public static void main(String[] args) {
        display();
    }
}
票数 2
EN

Code Review用户

发布于 2017-12-20 22:47:45

一些改进的想法:

  1. checkprime中,您不必从1循环到n,从1循环到sqrt(n)就足够了。
  2. outer循环效率很低。首先,每次您找到一个因素时,从一开始就开始寻找更多的因素,在已经检查过的数字上调用checkprime。第二,我不会费心检查从1到n的任何数字的checkprime,我会对除数进行检查。

一个更有效的循环是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 for(long  i = 1; i<= num ; i++)
    {
        if(num%i== 0 && checkprime(i))
        {
           sum= sum+ sumfinder(i); 
           num = num/i; 
           if (num == 1)
           {
               break outer; 
           }
        }
        i--; //check same factor again
    }
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/183327

复制
相关文章
在Linux系统中安装LAMP出现的错误总结
总结一下用源代码安装LAMP环境中遇到常见的错误,从错误3开始是因为安装php后面带参数,导到没有找到开发包例如:./configure --with-gd  --with-libjpeg会出现如下错误。
星哥玩云
2022/06/28
3.2K0
在Linux系统中安装LAMP出现的错误总结
在HTML页面中引入公共的部分的代码
在做前端网页的时候,会涉及到很多界面,有的时候,这些界面都会有重复的代码,比如侧边栏菜单的重复代码,头部导航的 重复代码,底部的重复代码,这个时候,为了使每个页面的代码看起来简洁明了,我们需要把这些重复的代码放到公共的页面里面,在具体页面只需引用即可。
王小婷
2019/05/17
5.3K0
FFmpeg代码导读——HEVC在RTMP中的扩展
为推进HEVC视频编码格式在直播方案中的落地,经过CDN联盟讨论,并和主流云服务厂商达成一致,规范了HEVC在RTMP/FLV中的扩展,具体修改内容见下。
LiveVideoStack
2021/09/02
1.7K0
FFmpeg代码导读——HEVC在RTMP中的扩展
4个代码中,出现频率最高的字符串
在程序员的代码里,字符串是经常出现的形式。有些语句虽然没有什么意义,但却无孔不入,我们经常见到它的身影。
xjjdog
2020/05/29
7170
在 Karma 中测试覆盖率
最近自己用vue造轮子开发UI框架 https://zyqq.github.io/wheel/,为了使代码更健壮,采用了Karma做单元测试,并尝试测试覆盖率以检测测试质量。以下是测试覆盖率过程。
EchoROne
2022/08/15
1.1K0
在 Karma 中测试覆盖率
IDEA中调试Topology出现的错误
在IDEA的maven项目中编写Topology出错: NoClassFound找不到主类:解决– 在pom.xml中,找到中的storm,添加<>compi<>
ZONGLYN
2019/08/08
1.4K0
算法-删除字符串中的公共字符
该文讲述了如何删除字符串中的公共字符,通过创建一个hash表来存储字符串中每个字符的出现次数,然后遍历字符串,将不需要删除的字符保留,需要删除的字符则用另一个数组存储,最后将修改后的字符串全部替换回来。这种方法的时间复杂度为O(n),空间复杂度为O(256)
chaibubble
2018/01/02
3.6K0
算法-删除字符串中的公共字符
angular2中在使用路由懒加载时候出现的错误
ERROR in Cannot use 'in' operator to search for 'providers' in null 出现这个问题的原因是,在使用懒加载的时候,没有指定module,没有找到相关的提供信息。 const routes: Routes = [ {path:'login',component:loginComponent}, { path: 'about', loadChildren: './home/home/home.module'},] 以上是修改之前报错的代码:
杭州前端工程师
2018/06/15
5.1K0
在Kubernetes集群中扩展CoreDNS
我正在分享在Kubernetes(1.12)中使用CoreDNS(1.2.5)运行的一些测试结果,以便为将CoreDNS调整到您的集群提供一些参考点。除了在默认配置中测试CoreDNS之外,我还测试了CoreDNS并启用了可选的autopath插件。autopath插件是一种优化,有助于透明地缓解由于Kubernetes臭名昭着的ndots:5问题而导致的Pod性能损失。这些测试在启用autopath时量化了内存/性能交易。
CNCF
2019/12/05
2.2K0
在Kubernetes集群中扩展CoreDNS
[译] 在 vue-test-utils 中 mock 全局对象
原文:https://itnext.io/mocking-global-objects-in-vue-test-utils-a8822df013a8
江米小枣
2020/06/15
1.6K0
VS2013中Python学习笔记[基础入门]
        在上一节中简单的介绍了在VS2013中如何进行开发Hello World,在VS2013中进行搭建了环境。本节主要来简单的学习一下关于Python的基础。
aehyok
2018/08/31
5230
VS2013中Python学习笔记[基础入门]
字符串中字符出现重复字符
下面是总结的一些常见问题,以供大家参考 第一次出现重复字符 出现的重复字符 出现字符串、字符还有次数 出现次数最多的字符及次数 class Eclass{ public static void main(String[] args) { String str = "eeeejwurihewweafa"; Eclass e = new Eclass(); //问题一 int index = e.Method(str); S
崔笑颜
2020/06/08
1.7K0
windows系统下VS2013或者VS2017的C4996错误解决方法
由于微软在VS2013中不建议再使用c的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误,在源文件中添加以下指令就可以避免这个错误提示: 法一: #define _CRT_SECURE_NO_WARNINGS 把这个宏定义一定要放到.c文件的第一行。 法二: 在主函数任意一行加上如下代码: #pragma warning(disable:4996) 如下图所示:
黑泽君
2018/10/11
7890
VS2013中Python学习笔记[环境搭建]
Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
aehyok
2018/08/31
7180
VS2013中Python学习笔记[环境搭建]
工作负载不要全部放在公共云的篮子中
有些东西并不属于公共场合,与此类似,公共云可能不总是适合所有工作负载。 这个声明从来没有像最近两次非常公开的云中断那样更加相关。亚马逊和微软公司对此都必须迅速采取行动,安抚那些无法连接到存储在其AWS
静一
2018/03/27
9860
工作负载不要全部放在公共云的篮子中
VS2013中Python学习笔记[环境搭建]
Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
aehyok
2019/02/25
5930
讨论覆盖函数中偏函数扩展的复杂性
摘要:覆盖函数是子模块函数的重要子类,可用于机器学习,博弈论,社交网络和设施位置。我们研究了覆盖函数的偏函数扩展的复杂性。也就是说,给定由[m]的子集族和每个点的值组成的部分函数,​​是否存在在[m]的所有子集上定义的扩展该偏函数的覆盖函数?偏函数扩展以前是针对其他函数类进行研究的,包括布尔函数和凸函数,并且在许多领域都很有用,例如在学习这些函数类时获得边界。
罗大琦
2019/07/18
8080
错误票据test
本文最后更新于 1163 天前,其中的信息可能已经有所发展或是发生改变。 #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<cmath> using namespace std; int main(){ int n; vector<string> vec; vector<string> vecarr; cin>>n; cin.ignore(); for(int i=0;i<n;i
Yuyy
2022/06/28
1360
在input中回车后页面提交导致出现HTTP 错误 405.0 - Method Not Allowed
前些时间在做一个搜索功能时发现一个比较有意思的现象,场景是这样的:在一个模态窗口中是一个订单列表,页面的顶部有若干个状态筛选框和一个搜索关键字输入框,当焦点在关键字输入框时按回车,本来是对input的keyup事件做了监听,当发现是按了回车键时便自动提交搜索请求的,但输入关键字后按回车时页面竟然跳转了,并且出现“HTTP 错误 405.0 - Method Not Allowed无法显示您正在查找的页面,因为使用了无效方法(HTTP 谓词)”的错误,非常纳闷。
风柏杨4711
2021/03/15
1.9K0
点击加载更多

相似问题

Django DRP post方法如何传递参数

23

使用POST方法的Django问题

42

AJAX传递POST请求,Django问题

24

hyperledger composer post方法:如何在post方法中传递参数

10

如何传递参数删除方法?(django)

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文