史密斯数,大输入优化的超时错误

时间:2017-02-06 21:01:25

标签: java math timeout mathematical-optimization

我写了这段代码,以检查hackerrank上是否没有smith no。 史密斯数是一个复合数,其数字之和是由于素因数分解(不包括)而得到的素数因子的总和。前几个这样的数字是4,22,27。 此代码完美地工作但输入的超时错误= 2050918644。 现在,您能告诉我如何编辑此代码并确保它不会给我超时错误

import java.io.*;
import java.util.*;

public class Solution {
static int sumD(int a){
        int sum=0;
    while(a>0)
    {
        int rem=0;
        rem=a%10;
        sum=sum+rem;
        a=a/10;


    }
    return sum;}
    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
    Scanner sc=new Scanner(System.in);
        int x=sc.nextInt();
        int s=0;
        int temp=x;
        for(int i=2;i<x;i++)
        {
            while(temp%i==0)
            {  s=s+ sumD(i);
            temp=temp/i;}
        }
        if(sumD(x)==s)
            {
            System.out.println(1);

        }
        else
            System.out.println(0);
        }

}

1 个答案:

答案 0 :(得分:0)

您无需从2一直循环到x。最糟糕的情况是你的数字是some prime number * 2,所以你将覆盖所有工作一半的素因子(因为素数本身不能是史密斯数)。所以你的for循环将如下所示:

for(int i=2;i<=x/2;i++)
{
    while(temp%i == 0){
        s=s+ sumD(i);
        temp=temp/i;
    }
}

这种方法的效果要快得多,而且可能会或可能不够,不是最佳的。如果你需要更快的东西,请阅读使用筛子,Pollard的rho算法等的素数因子分解算法。

另请注意,如果您想使用高于2^31-1的数字,则需要使用int之外的其他内容(至少long)。