calfcamel的2333(java)
一、問題描述
為祝賀新一批的研究生入學(xué),隊長讓大家為新人命題訓(xùn)練其程序設(shè)計能力。有人問隊長能不能黑,隊長說可以黑但是不能黑那啥。大家很失望 2333 ,于是 calfcamel 決定出一道 2333 的題目。
給你一個小于 60 位的整數(shù) p ,求大于 p 的最小的數(shù) p1 ,使得 p1 中包含數(shù) 2333 。
輸入數(shù)據(jù)
輸入數(shù)據(jù)的第一行為一個正整數(shù) T ,表示有 T 組數(shù)據(jù)。隨后的 T 行中每行包括一個小于 60 位的整數(shù) p ( T <= 50 , 1 <= p <10^60 ,即 10 的 60 次方)。
輸出數(shù)據(jù)
對每組輸入數(shù)據(jù)單獨輸出一行結(jié)果,第 x 行結(jié)果形如 ”Case #x: a“ ,其中 x 為組號,從 1 開始, a 為對應(yīng)的結(jié)果。
樣例輸入
2
100
1000000000000
樣例輸出
Case #1: 2333
Case #2: 1000000002333
二、解決方案:
題目要求輸出比原數(shù)大的最小整數(shù)且包含2333,一定注意題目要求的是大于p,不包含等于,所以當(dāng)你輸入2333的時候應(yīng)該返回12333,當(dāng)輸入23334的時候應(yīng)該返回23335。最容易想到的方法就是在原數(shù)的基礎(chǔ)上循環(huán)加1,直到新的數(shù)中包含2333為止。
那么我們該使用什么類型的數(shù)據(jù)呢?輸入的整數(shù)p有可能達(dá)到60位,而我們知道int型變量占4個字節(jié),32位,最大能表示的數(shù)為:2^32-1= 4 294 967 295;很顯然是遠(yuǎn)遠(yuǎn)達(dá)不到的,那么long呢?long變量占8個字節(jié),64位,最大能表示的數(shù)為2^64-1= 1.844674407371e+19 也是不夠的,所以只能考慮使用String類型,這時候令人頭疼的是如何使用String類型的變量能像整數(shù)那樣加1且合理進(jìn)位?
想象整數(shù)如何加1的,首先獲取字符串的最后1位last,應(yīng)該判斷l(xiāng)ast是否為9,如果last為9,則將last=0,則last前面1位需要加1,前面1位加1之后就得到了新的數(shù)字,可以判斷該數(shù)是否包含2333了,但是當(dāng)前面1位也是9時,就要設(shè)置這一位為0,并繼續(xù)將其前面一位加1,如此循環(huán)知道加到第一位,若第一位也為9,設(shè)置第一位為0,拼接在字符串前面一個1,并繼續(xù)按照上面思路循環(huán)…
其中我們可以很輕松的得到若輸入小于2333的數(shù),一定輸入2333,若輸入數(shù)為4位且大于等于2333,則一定輸入12333,故我們在加1循環(huán)之前可以先判斷輸入的整數(shù)p是否為小于4位的數(shù),這樣能提高計算效率。
三、核心代碼
if (sdata.length() <= 4) {// 當(dāng)數(shù)據(jù)位數(shù)為4位及以下時
int idata = Integer.parseInt(sdata);
if (idata < 2333) {
System.out.println(“Case #” + index + “: " + 2333);
} else {
System.out.println(“Case #” + index + “: " + 12333);
}
}
//字符串的加1函數(shù)
public static String add(String str){
char[] chars = str.toCharArray();
int len = chars.length;
for (int k = len - 1; k >= 0; k–) {//對字符串的位數(shù)循環(huán),直到第一位
int a = Integer.parseInt(String.valueOf(chars[k]));
if (a == 9 && k!=0) {//當(dāng)該位置數(shù)已經(jīng)為9,且不是第一位,則需要將該位置0
chars[k] = ‘0’;
continue;//繼續(xù)下一輪循環(huán)
} else if(a9&&k0){
//當(dāng)該位置數(shù)已經(jīng)為9,且是第一位,則需要將該位置0,且在字符串之前拼接上1,生成新的字符串,繼續(xù)循環(huán)
chars[k] = ‘0’;
str=“1”+new String(chars);
chars = str.toCharArray();
len = chars.length;
// System.out.println(“newSdata->”+sdata+”,newLen->”+len);
break;
}else{//若該位不是9,則該位數(shù)加1,跳出循環(huán),返回新的字符串
a++;
chars[k] = (char) (a + ‘0’);
str = new String(chars);
break;
}
}
return str;
}
總結(jié)
以上是生活随笔為你收集整理的calfcamel的2333(java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lineage Logistics收购U
- 下一篇: CURD同事狂刷阿里面试指南(恒山版),