- 来源: 编程之美
给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有"1"的个数。
例如:
N = 2,写下1,2。这样只出现了1个"1"
N = 12, 1,2,3,4,5,6,7,8,9,10,11,12。这样1的个数为5;
分析
具体分析见图
实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
System.out.println(Sum1s(Long.parseLong(scanner.next())));
}
}
public static long Sum1s(long n) {
long iCount = 0; //
long iFactor = 1; // 个十百千万
long iLowerNum = 0; // 低位数字 比如12123,以百位1为界,低位数字为23
int iCurrNum = 0; // 每一位上的数字,取值0-9
long iHigherNum = 0; // 高位数字,类似上面
while (n / iFactor != 0) {
iLowerNum = n - (n / iFactor) * iFactor; // 获得高位数字
iCurrNum = (int)(n / iFactor) % 10; // 获得当前位数字
iHigherNum = n / (iFactor * 10); // 获得高位数字
switch (iCurrNum) {
case 0 :
iCount += iHigherNum * iFactor; // 高位 * 当前位数
break;
case 1:
iCount += iHigherNum * iFactor + iLowerNum +1; //
break;
default:
iCount += (iHigherNum + 1) * iFactor;
break;
}
iFactor *= 10;
}
return iCount;
}
}
此致,敬礼