calfcamel的2333(java)

一、问题描述
为祝贺新一批的研究生入学,队长让大家为新人命题训练其程序设计能力。有人问队长能不能黑,队长说可以黑但是不能黑那啥。大家很失望 2333 ,于是 calfcamel 决定出一道 2333 的题目。

给你一个小于 60 位的整数 p ,求大于 p 的最小的数 p1 ,使得 p1 中包含数 2333 。
输入数据

输入数据的第一行为一个正整数 T ,表示有 T 组数据。随后的 T 行中每行包括一个小于 60 位的整数 p ( T <= 50 , 1 <= p <10^60 ,即 10 的 60 次方)。
输出数据

对每组输入数据单独输出一行结果,第 x 行结果形如 ”Case #x: a“ ,其中 x 为组号,从 1 开始, a 为对应的结果。
样例输入

2
100
1000000000000

样例输出

Case #1: 2333
Case #2: 1000000002333

二、解决方案:
题目要求输出比原数大的最小整数且包含2333,一定注意题目要求的是大于p,不包含等于,所以当你输入2333的时候应该返回12333,当输入23334的时候应该返回23335。最容易想到的方法就是在原数的基础上循环加1,直到新的数中包含2333为止。
那么我们该使用什么类型的数据呢?输入的整数p有可能达到60位,而我们知道int型变量占4个字节,32位,最大能表示的数为:2^32-1= 4 294 967 295;很显然是远远达不到的,那么long呢?long变量占8个字节,64位,最大能表示的数为2^64-1= 1.844674407371e+19 也是不够的,所以只能考虑使用String类型,这时候令人头疼的是如何使用String类型的变量能像整数那样加1且合理进位?
想象整数如何加1的,首先获取字符串的最后1位last,应该判断last是否为9,如果last为9,则将last=0,则last前面1位需要加1,前面1位加1之后就得到了新的数字,可以判断该数是否包含2333了,但是当前面1位也是9时,就要设置这一位为0,并继续将其前面一位加1,如此循环知道加到第一位,若第一位也为9,设置第一位为0,拼接在字符串前面一个1,并继续按照上面思路循环…
其中我们可以很轻松的得到若输入小于2333的数,一定输入2333,若输入数为4位且大于等于2333,则一定输入12333,故我们在加1循环之前可以先判断输入的整数p是否为小于4位的数,这样能提高计算效率。
三、核心代码
if (sdata.length() <= 4) {// 当数据位数为4位及以下时
int idata = Integer.parseInt(sdata);
if (idata < 2333) {
System.out.println(“Case #” + index + “: " + 2333);
} else {
System.out.println(“Case #” + index + “: " + 12333);
}
}
//字符串的加1函数
public static String add(String str){
char[] chars = str.toCharArray();
int len = chars.length;
for (int k = len - 1; k >= 0; k–) {//对字符串的位数循环,直到第一位
int a = Integer.parseInt(String.valueOf(chars[k]));
if (a == 9 && k!=0) {//当该位置数已经为9,且不是第一位,则需要将该位置0
chars[k] = ‘0’;
continue;//继续下一轮循环
} else if(a9&&k0){
//当该位置数已经为9,且是第一位,则需要将该位置0,且在字符串之前拼接上1,生成新的字符串,继续循环
chars[k] = ‘0’;
str=“1”+new String(chars);
chars = str.toCharArray();
len = chars.length;
// System.out.println(“newSdata->”+sdata+”,newLen->”+len);
break;
}else{//若该位不是9,则该位数加1,跳出循环,返回新的字符串
a++;
chars[k] = (char) (a + ‘0’);
str = new String(chars);
break;
}
}
return str;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值