EMC的一道数字编程编程题

版权归EMC所有。



解题思路:此道题目的解题要点有两点。第一,利用进位的思想,如果当前位没有办法通过修改当前位数字为3或5使得修改后的数字比原来的数字大,则需要进位。第二,如果当前位修改后的数字比它原来的数字大,则要将当前位以后的数字全部置为3。详细情况,参看代码注释。

import java.util.Scanner;

public class Copy_2_of_Main {
	
	public static void main(String[] args) {
		@SuppressWarnings("resource")
		Scanner scan = new Scanner(System.in);
		while (true){
			String a = scan.next();
			char[] c = a.toCharArray();
			cal(c);
		}
	}
	
	public static String cal(char[] c){
		int carry = 1;	//carry初始化数值为1,可视为个位被加了一个1。
		for (int i = c.length -1; i >= 0; i--){
			int n = c[i] - '0' + carry;
			if (n >=0 && n < 3){	// [0, 3) 本位数字设置为3,变大了,那么后面的位都置为3。
				c[i] = '3';
				carry = 0; //不需要再向前进位
				reSetBack(c, i + 1);
			}else if (n == 3){ //无论之前carry为1还是0,都不再需要进位。
				c[i] = '3';
				carry = 0;
            }
			else if (n > 3 && n < 5){	// (3, 5) 本位数字设置为5,变大了,那么后面的位都置为3。
                c[i] = '5';
				carry = 0; //不再需要向前进位
				reSetBack(c, i + 1);
			}else if (n == 5){ //与n==3时的情况,是一样的
				c[i] = '5';
				carry = 0;
			}else if (n > 5){	// (5, 9] 本位数字设置为3,变小了,那么后面的位都置为3。并且,需要向前进位。
				c[i] = '3';
				carry = 1;
				reSetBack(c, i + 1);
			}
		}
		String res = String.valueOf(c);
		if (carry == 1){ //如果还有进位,则将res*10+3。
			res += "3";
		}	
		System.out.println(res);
		return res;
	}
	
	public static void reSetBack(char[] c, int l){ //设置之后的位全部为3
		if (l >= c.length)
			return;
		for (int i = l; i < c.length; i++){
			c[i] = '3';
		}
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值