您的位置:首页 > 其它

project euler 32

2015-12-04 21:10 357 查看


Problem
32

Pandigital products

We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once; for example, the 5-digit number, 15234, is 1 through 5 pandigital.

The product 7254 is unusual, as the identity, 39 × 186 = 7254, containing multiplicand, multiplier, and product is 1 through 9 pandigital.

Find the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through 9 pandigital.

HINT: Some products can be obtained in more than one way so be sure to only include it once in your sum.

全数字的乘积

如果一个n位数包含了1至n的所有数字恰好一次,我们称它为全数字的;例如,五位数15234就是1至5全数字的。

7254是一个特殊的乘积,因为在等式39 × 186 = 7254中,被乘数、乘数和乘积恰好是1至9全数字的。

找出所有被乘数、乘数和乘积恰好是1至9全数字的乘法等式,并求出这些等式中乘积的和。

注意:有些乘积可能从多个乘法等式中得到,但在求和的时候只计算一次。

package projecteuler;

import java.util.HashSet;
import java.util.Set;

import org.junit.Test;

public class Prj32 {

/**
* We shall say that an n-digit number is pandigital if it makes use of all
* the digits 1 to n exactly once; for example, the 5-digit number, 15234,
* is 1 through 5 pandigital.
*
* The product 7254 is unusual, as the identity, 39 × 186 = 7254, containing
* multiplicand, multiplier, and product is 1 through 9 pandigital.
*
* Find the sum of all products whose multiplicand/multiplier/product
* identity can be written as a 1 through 9 pandigital.
*
* HINT: Some products can be obtained in more than one way so be sure to
* only include it once in your sum.
*/
@Test
public void test() {
// System.out.println(9 * 9999);
// System.out.println(10 * 999);
// System.out.println(99 * 999);
System.out.println(Calculator.calculate());
}

public static class Calculator {

/**
* a + b + c = 9; a = 1 && b = 4; a = 2 && b = 3;
*
* @return
*/
public static int calculate() {

int a = 0;
int b = 0;
Set<Integer> set = new HashSet<Integer>();
for (a = 1; a <= 10; a++) {
for (b = 1000; b <= 10000; b++) {
if (checkNum(a, b, a * b)) {
System.out.println(a + "*" + b + "=" + a * b);
set.add(a * b);
}
}
}

for (a = 10; a <= 100; a++) {
for (b = 100; b <= 1000; b++) {
if (checkNum(a, b, a * b)) {
System.out.println(a + "*" + b + "=" + a * b);
set.add(a * b);
}
}
}

int sum = 0;
for (Integer intVal : set) {
sum += intVal;

}

return sum;
}

public static boolean checkNum(int a, int b, int c) {
Set<Integer> set = new HashSet<Integer>();
int val = a;
while (val >= 10) {
if (set.contains(val % 10)) {
return false;
}
set.add(val % 10);
val /= 10;
}
if (set.contains(val)) {
return false;
}
set.add(val);
val = b;
while (val >= 10) {
if (set.contains(val % 10)) {
return false;
}
set.add(val % 10);
val /= 10;
}
if (set.contains(val)) {
return false;
}
set.add(val);
val = c;
while (val >= 10) {
if (set.contains(val % 10)) {
return false;
}
set.add(val % 10);
val /= 10;
}
if (set.contains(val)) {
return false;
}
set.add(val);
return set.size() == 9 && set.contains(1) && set.contains(2)
&& set.contains(3) && set.contains(4) && set.contains(5)
&& set.contains(6) && set.contains(7) && set.contains(8)
&& set.contains(9);
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: