我写了这段代码,以检查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);
}
}
答案 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
)。