全数字乘积
如果一个 n 位数使用了 1 到 n 中每个数字且只使用了一次,我们称其为全数字。例如,
15234 这个五位数,是 1 到 5 全数字的。
7254 是一个不寻常的数,因为:39 × 186 = 7254 这个算式的乘数,被乘数和乘积组成了
一个 1 到 9 的全数字组合。
找出所有能够组合成 1 到 9 全数字的乘法算式中乘积的和。
提示: 有的乘积数字能够被多个乘法算式得到,所以在计算时要记得只计算它们一次。
答案:45228
可能的情况:一位乘以四位等于四位,二位乘以三位等于四位
代码如下:
static int[]a=new int[10000];
public static int add(){
int t=0,m;
for(int i=2;i<=9;i++){
for(int j=1000;j<=9999;j++){
if(j%10==i||j/10%10==i||j/100%10==i||j/1000%10==i)
continue;
else {
m=i*j;
if(judge(i,j,m)&&a[m]!=-1){
t+=m;
a[m]=-1;
System.out.println(i+" "+j+" "+m);
}
}
}
}
for(int i=10;i<=99;i++)
for(int j=100;j<=999;j++){
String s1=Integer.toString(i),s2=Integer.toString(j);
String s=s1+s2;
Set<Character> set = new HashSet<Character>();
char[] chars = s.toCharArray();
for(char c:chars) {
set.add(c);
}
if(s.length()!= set.size()) continue;
m=i*j;
if(judge(i,j,m)&&a[m]!=-1){
t+=m;
a[m]=-1;
System.out.println(i+" "+j+" "+m);
}
}
return t;
}
public static boolean judge(int i,int j,int m){
String s1=Integer.toString(i),s2=Integer.toString(j),s3=Integer.toString(m);
String s=s1+s2+s3;
if(s.length()!=9) return false;
Set<Character> set = new HashSet<Character>();
char[] chars = s.toCharArray();
for(char c:chars) {
if(c=='0') return false;
set.add(c);
}
return (set.size()==s.length());
}
public static void main(String[] args) {
System.out.println(add());
}
程序运行结果:
可参考代码:
import java.util.Arrays;
public class p032 {
public String run() {
int sum = 0;
for (int z = 1; z < 10000; z++) {
if (hasPandigitalProduct(z))
sum += z;
}
return Integer.toString(sum);
}
private static boolean hasPandigitalProduct(int z) {
for (int x = 1; x <= z; x++) {
//先找到 z 的所有因子 x,把 x,z/x(即 y),z 连接起来进行判断,如果是全数字乘积则 true
if (z % x == 0 && isPandigital("" + x + z/x + z))
return true;
}
return false;
}
//判断字符串 s 是否是全数字串(思路:先转化为字符数组,然后排序,再恢复成串,和"123456789"进
行比较即可)
private static boolean isPandigital(String s) {
if (s.length() != 9)
return false;
char[] temp = s.toCharArray();
Arrays.sort(temp); //字符数组从小到大排序
return new String(temp).equals("123456789");
}
public static void main(String[] args) {
System.out.println(new p032().run());
}
}