“让我怎能过大年”参考解法--很暴力

前言

这是一个暴力解法,时间之长,令人发指。

Q:

图1

有如上的加法算式。其中每个汉字代表一个数字。
请填写“让我怎能过大年” 所代表的整数。
所有数字连在一起,中间不要空格。例如:"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
 *      "大"36"大",但是,别忘了加上进位4
 *      ((3 * 6) + 4) % 10 = 2  ==  2
 *      满足其余数等于"能(=2)",记录进位 ((3 * 6) + 4) = 2
 *      "过"75"过"
 *      ((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

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值