我會怎麼做:
- 開始在999,向後工作我的方式,以998,997,等
- 創建我目前的數字迴文。
- 確定此數字的素數因子分解(如果您有預先生成的素數列表,則並非全部昂貴)
- 通過此素數因子分解列表來確定是否可以使用這些因子的組合來製作2 3位數
一些代碼:。
int[] primes = new int[] {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,
73,79,83,89,97,101,103,107,109,113,,127,131,137,139,149,151,157,163,167,173,
179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,
283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,
419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,
547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,
661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,
811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,
947,953,967,971,977,983,991,997};
for(int i = 999; i >= 100; i--) {
String palstr = String.valueOf(i) + (new StringBuilder().append(i).reverse());
int pal = Integer.parseInt(pal);
int[] factors = new int[20]; // cannot have more than 20 factors
int remainder = pal;
int facpos = 0;
primeloop:
for(int p = 0; p < primes.length; i++) {
while(remainder % p == 0) {
factors[facpos++] = p;
remainder /= p;
if(remainder < p) break primeloop;
}
}
// now to do the combinations here
}
當然,你可以更優化它,你可以做在紙張上一些自己的數學削減搜索空間。這就成了一個問題,設置任務的人願意接受什麼,因爲問題只有一個正確的答案,而打印該數字的最佳方式就是將其作爲字符串放在源代碼中。一個相關的概念是決定一個數是否爲素數,併產生一個*證明*,它是主要的。 –
@Steve Jessop,你能舉一些這個問題的代碼.. – ferhan
例如,一個程序,只是'System.out.println(「906609」);'功能上等價於你(證明不適合這個邊際),毫無疑問更快。當然,這是削減搜索空間的一個極端例子。由於任何可被100除盡的結果都在'00'結束,因此不是迴文,因此起始於101而不是100作爲較低的循環界限而具有極小的性能增益。你必須自己決定在那個範圍內你做了「太多」的數學證明,沒有足夠的數字處理。 –