前言
这是一个暴力解法,时间之长,令人发指。
Q:
有如上的加法算式。其中每个汉字代表一个数字。
请填写“让我怎能过大年” 所代表的整数。
所有数字连在一起,中间不要空格。例如:"3125697"。当然,这个不是正确的答案。
注意:只填写一个整数,不要填写任何多余的内容。
正常解法参考
正常的解法,经过我的窥探,是对7位数字直接取模得到7个数字,然后依次算出
1.
7个数字之间相关的和
如“年”是5,“大”是6,“过”是3,那么就是
5 + (6*10+5)+(3*100 + 6 * 10 + 5) ……
往下推,求得整体和
2.
第4个数字的值 * 1111111得到乘积
然后判断求得的和与该乘积是否相等,注意每个数字不同。
正常解法实现链接
http://blog.csdn.net/u012110719/article/details/44957367
暴力解法参考
/**
* 非常暴力的一个方法
* 让我怎能过大年,一共7个数字,其中每个数字[不相同],即7个数字不能重复
* 其中通过图片,可以发现
* 7个“年”相加
* 6个“大”相加
* 5个“过”相加
* ····
*
* 以此类推,每个数字相加
* 只要每次相加之后对10取模的余数等于“能”即可。
*
* 例如5602341
* 年是1,能是2
* 1 * 7 % 10 = 7 != 2
* 既然不相等,那么肯定不是我们要找的数字,不再判断,寻找下一个
*
* 又例如1362736
* "年"是6,"能"是2,
* (6 * 7) % 10 = 2 == 2
* 相等,那么记录其进位 6 * 7 / 10 = 4
* "大"是3,6个"大",但是,别忘了加上进位4
* ((3 * 6) + 4) % 10 = 2 == 2
* 满足其余数等于"能(=2)",记录进位 ((3 * 6) + 4) = 2
* "过"是7,5个"过"
* ((5 * 7) + 2) % 10 = 4 != 2好吧又不满足,跳过,寻找下一个数字
*
* 如果满足的话,应该是能够从头遍历到尾
*/
暴力解法实现
import java.util.LinkedHashSet;
public class Main {
public static void main(String[] args) {
for (int i = 1000000; i < 9999999; i++) {
if (isFind(i) && !isRepeat(i)) {
System.out.println(i);
break;
}
}
}
/**
*
* @param n 获取到的数字
* @return 如果重复,则返回真,否则返回假。
*/
static boolean isRepeat(int n) {
LinkedHashSet<String> t = new LinkedHashSet<>();
String[] numStr = String.valueOf(n).split("");
for (int i = 0; i < numStr.length; i++) {
if (t.contains(numStr[i])) {
return true;
}
t.add(numStr[i]);
}
return false;
}
/**
*
* @param n 获取到的数字
* @return 如果符合题目要求,返回真,否则返回假
*/
static boolean isFind(int n) {
//将数字切割成单个的字符
String[] s = String.valueOf(n).split("");
//last表示进位,第一次没有进位,所以是0
//v是临时变量,将单个字符转换成数字,方便相加
int sum, v, last = 0;
for (int j = 7; j >= 1; j--) {
v = Integer.valueOf(s[j - 1]);
sum = v * j + last;
last = sum / 10;
//只要不等于“等”,就返回假
if (sum % 10 != Integer.valueOf(s[3])) {
return false;
}
}
return true;
}
}
结果
1572836