您的位置:首页 > 编程语言

EMC的一道数字编程编程题

2015-11-22 16:47 417 查看
版权归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';
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: