java計算1-n中1出現的次數

public class n_1_300 {
// 思路:分別計算“1”在每個位(個位,十位,百位……)上面出現的次數,疊加起來
public static int countNum(int n) {
if (n <= 0) {
return 0;
}
int count = 0;
int factor = 1;
while (n / factor != 0) {
int lowerNum = n - n / factor * factor;
System.out.println("最低位是:" + lowerNum);
int currentNum = (n / factor) % 10;
System.out.println("當前位是:" + currentNum);
int highNum = n / (factor * 10);
System.out.println("最高位是:" + highNum);
if (currentNum == 0) {
// 如果爲0,出現1的次數由高位決定
count += highNum * factor;
} else if (currentNum == 1) {
// 如果爲1,出現1的次數由高位和低位決定
count += highNum * factor + lowerNum + 1;
} else {
// 如果大於1,出現1的次數由高位決定
count += (highNum + 1) * factor;
}
factor *= 10;
}
return count;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("含1個數爲:" + countNum(25));
System.out.println();
System.out.println("含1個數爲:" + countNum(125));
}

}

以上代碼爲別處所轉,以下純爲爲個人理解,有誤請指正,謝謝

計算25的全部步驟:

第一次循環,當factor=1時,while中的循環語句n / factor != 0,是爲了求個位數帶1的循環,如25取值25,繼續,當執行了lowerNum = n - n / factor * factor時,最低位爲0,當執行currentNum = (n / factor) % 10時,當前位爲5,當執行highNum = n / (factor * 10)時,最高位爲2。其實可以把“25”理解成“25.0”,低位,當前位,高位就是0,5,2,可以看出當前位就是指個位的5。

根據當前位計算個位數含“1”的個數,之所以用(highNum + 1) * factor表達式,是因爲highnum代表高位的2,這裏的2也可以理解成十以上的個位數含“1”的個數2個如:“11”個位數的“1”和“21”個位數的”1“。再加上“1”本身的1,所以個位含“1”共3個。

第二次循環,當factor=10時,while中的循環語句n / factor != 0,是爲了求十位數帶1的循環,此時,低位,當前位,高位分別爲5,2,0,可以把“25”理解成“025”,即百位補了個0,可以看出當前位就是指十位的2,當前位大於1,用(highNum + 1) * factor表達式,表達式中的highnum爲0,意思是百位爲0,則有0個十位數爲1的三位數,如果百位爲1,則有1*10個十位數爲“1”的三位數(如110,111,112,113……119共10個數),如果百位爲2,則有2*10個十位數爲1的三位數(如110,111,112,113……119,210,211,212,213……219共20個數)。表達式括號中的1指1*10個十位數爲“1”的兩位數(指10,11,12,13 ……19共10個數),所以結果是(0+1)*10=10,說明十位上含有10個含“1”的數。

第三次循環,停止,結果:個位數+十位數=3+10=13

計算100的全部步驟:

第一次循環,當factor=1時,125看成“125.0”,所以低位,當前位,高位就是0,5,12,計算表達式(highNum + 1) * factor,highNum =12代表了(11,21,31,41……121個位數的“1”共12個),再加上“1”本身的1,所以個位含“1”共13個。

第二次循環,當factor=10時,低位,當前位,高位就是5,2,1,計算表達式(highNum + 1) * factor,highNum =1,代表百位爲1,則有1*10個十位數爲1的三位數(如110,111,112,113……119共10個數),表達式括號中的1指1*10個十位數爲“1”的兩位數,(如10,11,12,13 ……19共10個數),(1+1)*10=20,十位數含“1”共20個。

第三次循環,當factor=100時,低位,當前位,高位就是25,1,0,計算表達式highNum * factor + lowerNum + 1,highNum =0,代表千位爲0,則有0個百位數爲“1”的四位數,lowerNum=1,代表十位爲25,則有25個百位數爲“1”的三位數(如:101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125),表達式中的1指1個百位數爲“1”的三位數(如100),百位數含“1”共26個。

第四次循環,停止,結果:個位數+十位數+百位數=13+20+26=59

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章