Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
WA了3次,终于想通了^0^喜欢java的朋友一起来切除啊!/**************************************************************** *WA了3次,终于想通了^0^喜欢java的朋友一起来切除啊! *其实这道题目很简单的!我WA就WA在不知道Smith Number的上界是多少。 *个人认为,该题最有意义的部分就是:把一个数n因式分解时,只需要 *求出不大余sqrt(n)的因子a就可以了,因为一定存在另一个大余sqrt(n) *的对应因子b,使得n=a*b。 *这样问题的规模就减少到sqrt(n),不是n。 *有一点很郁闷!只能把所有的方法和数据域都声明成static! *因为要在main这个static方法里调用啊! ***************************************************************/ import java.io.*; import java.util.*; class Main { private static int[] primeArray; private static int arraySize; public static void main(String[] args) throws Exception { primeArray=new int[3000]; arraySize=Seive(primeArray,11000);//WA在这里, //不知道Smith Number的上界是多少 /************************************************** *题目中说,最大是8位数,我找出了最大的Smith Number 100000165(9位数) **************************************************/ BufferedReader cin=new BufferedReader(new InputStreamReader(System.in)); String str; StringTokenizer strtoken; int start; str=cin.readLine(); strtoken=new StringTokenizer(str); start=Integer.parseInt(strtoken.nextToken()); while(start!=0) { long SmithNumber=getSN((long)start); System.out.println(SmithNumber); str=cin.readLine(); strtoken=new StringTokenizer(str); start=Integer.parseInt(strtoken.nextToken()); } } //Get the minimum Smith Number lager than start private static long getSN(long start) { long i; int a,b; i=start+1; while(true){ a=sumOf(i); b=primeSumOf(i); if(a==b)break; else ++i; } return i; } //The digits Sum of a long private static int sumOf(long a) { int s=0; while(a/10>0){ s+=(int)(a%10); a/=10; } return (s+(int)a); } //The Prime factors' digits sum of a long private static int primeSumOf(long a) { int i,j; int s=0,num,b; long at=a; b=(int)Math.sqrt((double)a); i=0; j=primeArray[i]; while(j<=b&&a!=1){ if(a%j==0) { num=0; while(a%j==0) {a/=j;++num;} s+=(sumOf(j)*num); } i++; j=primeArray[i]; } if(at==a)return 0; else if(a==1)return s; else return s+sumOf(a); } //Seive out all the prime numbers less than Integer high private static int Seive(int[] primeArray,int high) { BitSet number=new BitSet(high+1); int sqrtHigh=(int)Math.sqrt((double)high); int i,j; for(i=2;i<=sqrtHigh;++i) if(!number.get(i)) { j=i+i; while(j<=high) { number.set(j); j+=i; } } primeArray[0]=2; j=1; for(i=3;i<=high;++i) if(!number.get(i))primeArray[j++]=i; return j; } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator