算法问题:数字1的数量
给定一个十进制的正整数N,写下从1开始,到N结束的所有正整数,计算出 其中出现所有1的个数
比如:输入12,输出5,,因为它其中有1 的数有,1,10,11,12,他们其中1出现了5次
import java.util.Scanner; /** * 需求:基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 * 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。 例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。 * @author lwp * *李文朋 */ public class ShuZi1DeShuLiang { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); long n = scanner.nextInt(); System.out.println(Count(n)); } private static long Count(long n){ //1的个数 long count = 0; //当前位 long Factor = 1; //低位数字 long LowerNum = 0; //当前位数字 long CurrNum = 0; //高位数字 long HigherNum = 0; if(n <= 0){ return 0; } while(n / Factor != 0){ //低位数字 LowerNum = n - (n / Factor) * Factor; //当前位数字 CurrNum = (n / Factor) % 10; //高位数字 HigherNum = n / (Factor * 10); //如果为0,出现1的次数由高位决定 if(CurrNum == 0){ //等于高位数字 * 当前位数 count += HigherNum * Factor; } //如果为1,出现1的次数由高位和低位决定 else if(CurrNum == 1){ //高位数字 * 当前位数 + 低位数字 + 1 count += HigherNum * Factor + LowerNum + 1; } //如果大于1,出现1的次数由高位决定 else{ //(高位数字+1)* 当前位数 count += (HigherNum + 1) * Factor; } //前移一位 Factor *= 10; } return count; } }