不定方程解法
1、对于ax +by = c
(1)当数目很小时,可通过暴力破解的方法解决
//4x -5y = 7
for(int x = 0;x<100;x++){
for(int y = 0;y<100;y++){
if(4*x-5*y==7){
System.out.println(x+" "+y);
}
}
}
(2)ax = c - by;c-by 一定可以被a整除
① 求出特解,从双重循环到单层循环
②求出通解
for(int y = 0;y<100;y++){
if((7+5*y)%4)
System.out.println("y="+y);
System.out.println("x="+((7+5*y)/4);
}
2、水仙花数
例如,N=4,1634 = 1^4 +6^4+3^4+4^4;
N=5,92727 = 9^5+2^5+7^5+2^5+7^5;
.......
问N=21,求所有满足条件的花朵数。
解:a^21+b^21+c^21+d^21……=abcd……
思想:这道题N值过大,不能用暴力搜索,它的和只与某个数字出现的次数有关。
import java.math.BigInteger;
public class A {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 0;i<base.length;i++) {
base[i] = calcu_21(i);
}
int [] a = new int [10]; //每个数字取几次
f(a,0,21);
}
private static BigInteger [] base = new BigInteger[10];
private static BigInteger calcu_21(int n) {
BigInteger a = BigInteger.ONE;
for(int i = 0;i<21;i++) {
a = a.multiply(BigInteger.valueOf(n));
}
return a;
}
private static void test(int [] a) {
BigInteger bn = BigInteger.ZERO;
for(int i = 0;i<a.length;i++) {
bn = bn.add(base[i].multiply(BigInteger.valueOf(a[i])));
}
String s = bn.toString();
if(s.length()!=21) return;
int [] b = new int [10];
for(int i = 0;i<s.length();i++) {
b[s.charAt(i)-'0'] ++;
}
for(int i = 0;i<10;i++) {
if(a[i]!=b[i]) return;
}
System.out.println(bn);
}
//处理第k个,还有sum个名额
private static void f(int [] a ,int k,int sum) {
if(sum==0) {
test(a);
return;
}
if(k==a.length-1) {
a[k] = sum;
test(a);
return;
}
for(int i = 0;i<=sum;i++) {
a[k] = i;
f(a,k+1,sum-i);
a[k] = 0;
}
}
}