给定数据求最大数问题

给定任意一个正整数,从1到9中选取任意数字相加的和为给定的整数,且由这些数字组成一个最大数,且相邻两数不能重复,如3的组合为21,4的组合为121。

由于相邻两数不能重复,而且组合出来的数字需要尽可能大,则第一原则是保证足够多的位数,在位数相同的情况下保证高位的数比低位的数大,由此可得出2和1来进行组合。

(1)假设最高为为1,则从给定的数值减去1。

(2)在(1)中减去1后的值中减去1或者2,由于(1)中减去1则只能减去2。

(3)重复(1)和(2)中的步骤,当给定的数值只剩 1 或者 2 时,1不做操作,如果为2则将组合的 1 和 2 的位置对调。

下面为Java代码实现

public static String max(int in) {
    if (in < 3) {
        return in+"";
    }
    int flag = 1;
    boolean re;
    StringBuilder sb = new StringBuilder();
     re = doSomething(flag, in, sb, 1);
    if (re) {
        flag=2;
        sb = new StringBuilder();
        doSomething(flag, in, sb, 2);
    }
    return sb.toString();
}
private static boolean  doSomething(int flag, int in, StringBuilder sb, int f) {
    boolean re = false;
    int c = in;
    while (c > 0) {
        sb.append(flag);
        c = c - flag;
        if (flag == 1) {
            flag = 2;
        } else {
            flag = 1;
        }
        if (f == 1 && (c < flag || c == 2)) {
            re = true;
            return re;
        } else if ( f == 1 && c == flag) {
            re = false;
            sb.append(c);
            return re;
        }
    }
    return re;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值