水仙花数的求解-算法优化
算法一
package narcissus;
//效率最高的算法之一
import java.math.BigInteger;
import java.util.Arrays;
//效率很慢,而且时间不能正常显示
public class RefSXS{
static BigInteger[] table=new BigInteger[10];
public static int N=3;
static int[] num=new int[N];
public static void main(String[] args){
long time1=System.currentTimeMillis();
generateTable();
generateNumber();
long time2=System.currentTimeMillis();
String spend=String.valueOf(time2-time1);
System.out.println("总共花费"+spend+"ms");
}
public static void generateTable(){
for(int i=0;i<10;i++){
table[i]=BigInteger.valueOf(i).pow(N);
}
}
public static void generateNumber(){
int[] num=new int[N];
int i=0;
while(true){
if(i==N-1){
isSXS(num);
}else{
i++;
num[i]=num[i-1];
continue;
}
//回溯到指定位置为止
while(i>=0&&num[i]==9){
i--;
}
if(i>=0){
num[i]++;
}else{
break;
}
}
}
private static void isSXS(int[] num) {
BigInteger y=BigInteger.valueOf(0);
for(int a:num){
y=y.add(table[a]);
}
int[] sum=new int[N];
String xs=y.toString();
if(xs.length()>num.length){
return;
}
for(int i=0;i
sum[i]=xs.charAt(i)-'0';
}
Arrays.sort(sum);
if(Arrays.equals(num, sum)&&xs.length()==N){
System.out.println(y);
}
}
}
算法二
package narcissus;
/*
* 我自己写的模拟加法操作+组合数学0-9(需要去除10,20,30,……,90)-》
* 11-19(需要去除21,31,41,……,91)-》
* 22-29(需要去除32,42,……,92)-》
* 33-39(需要去除43,53,……,93)-》……
*/
import java.math.BigInteger;
import java.util.Arrays;
//效率很慢,而且时间不能正常显示
public class MyOwnSXS2{
static BigInteger[] table=new BigInteger[10];
public static int N=21;
static int[] num=new int[N];
public static void main(String[] args){
long time1=System.currentTimeMillis();
generateTable();
generateNumber();
long time2=System.currentTimeMillis();
String spend=String.valueOf(time2-time1);
System.out.println("总共花费"+spend+"ms");
}
public static void generateTable(){
for(int i=0;i<10;i++){
table[i]=BigInteger.valueOf(i).pow(N);
}
}
public static void generateNumber(){
int[] num=new int[N];
int i=0;
while(true){
i=N-1;
isSXS(num);
num[i]++;
while(i>=0&&num[i]>9){
i--;
if(i<0) break;
num[i]++;
num[i+1]=0;
}
if(i<0) break;
while(i
num[i+1]=num[i];
i++;
}
}
}
private static void isSXS(int[] num) {
BigInteger y=BigInteger.valueOf(0);
for(int a:num){
y=y.add(table[a]);
}
int[] sum=new int[N];
String xs=y.toString();
if(xs.length()>num.length){
return;
}
for(int i=0;i
sum[i]=xs.charAt(i)-'0';
}
Arrays.sort(sum);
if(Arrays.equals(num, sum)&&xs.length()==N){
System.out.println(y);
}
}
}
算法三
package narcissus;
//我自己写的模拟加法操作算法:只是减少了for循环,用while实现多重循环
//针对所有的数的验证
import java.math.BigInteger;
import java.util.Arrays;
//效率很慢,而且时间不能正常显示
public class MyOwnSXS1{
static BigInteger[] table=new BigInteger[10];
public static int N=9;
static int[] num=new int[N];
public static void main(String[] args){
long time1=System.currentTimeMillis();
generateTable();
generateNumber();
long time2=System.currentTimeMillis();
String spend=String.valueOf(time2-time1);
System.out.println("总共花费"+spend+"ms");
}
public static void generateTable(){
for(int i=0;i<10;i++){
table[i]=BigInteger.valueOf(i).pow(N);
}
}
public static void generateNumber(){
int[] num=new int[N];
int i=0;
while(true){
i=N-1;
isSXS(num);
num[i]++;
while(i>=0&&num[i]>9){
i--;
if(i<0) break;
num[i]++;
num[i+1]=0;
}
if(i<0) break;
}
}
private static void isSXS(int[] num) {
BigInteger y=BigInteger.valueOf(0);
for(int a:num){
y=y.add(table[a]);
}
int[] sum=new int[N];
String xs=y.toString();
if(xs.length()>num.length){
return;
}
for(int i=0;i
sum[i]=xs.charAt(i)-'0';
}
Arrays.sort(sum);
if(Arrays.equals(num, sum)&&xs.length()==N){
System.out.println(y);
}
}
}
相关知识
水仙花数求解
Raptor水仙花数算法流程图
java求水仙花数简单算法
Python实现水仙花数高效查找算法与应用实例详解
水仙花数算法实现:Python计算100
求解物流配送问题的混合粒子群算法
花授粉优化算法及代码实现
算法——X^3+Y^3+Z^3=XYZ(水仙花数)
【优化求解】基于萤火虫算法GSO求解最优目标matlab代码
智能优化算法:食肉植物算法
网址: 优化水仙花数求解算法 https://m.huajiangbk.com/newsview2336955.html
上一篇: 探秘合欢花中药,功效、应用与常见 |
下一篇: 求财时应该选择哪种花?这种花的花 |