数字1的数量

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。

例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Sample Input
12
Sample Output
5

分析:直接去每个统计是不现实的,肯定会超,那么就需要分析出规律了,把问题拆分来看的话,我们只需统计个位,十位,百位。。。。,每个的数字,然后累加就可以了,每种数字统计的时候,和当前位的数值有关系。具体分析如下:

假设N,我们要计算百位上出现1的次数,将由三部分决定:百位上的数字,百位以上的数字,百位一下的数字。

如果百位上的数字为0,则百位上出现1的次数仅由更高位决定,

比如12013,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,共1200个。

等于更高位数字乘以当前位数,即12 * 100。

如果百位上的数字大于1,则百位上出现1的次数仅由更高位决定,比如12213,

百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,12100~12199共1300个。

等于更高位数字加1乘以当前位数,即(12 + 1)*100。

 如果百位上的数字为1,则百位上出现1的次数不仅受更高位影响,还受低位影响。例如12113,

受高位影响出现1的情况:100~199,1100~1199,2100~2199,…,11100~11199,共1200个,但它还受低位影响,

出现1的情况是12100~12113,共114个,等于低位数字113+1。

那么代码就好写了:

import java.util.*;  
public class Main {  
    static Scanner in = new Scanner(System.in); 
    public static void main(String[] args) {
    	int n = in.nextInt();
    	int t,tn;
    	long ans = 0;
    	tn = n;
    	int mul = 1;
    	while (tn != 0){  
            t = tn % 10;  
            if (t == 0)  
                ans += n / (mul * 10) * mul;//仅仅和高位有关
            else if (t == 1){  
                ans += n / (mul * 10) * mul; //高位 
                ans += (n % mul) + 1;  //低位
            }else  
                ans += (n / (mul * 10) + 1) * mul;  //高位
            mul *= 10;  
            tn /= 10;  //依次个位,十位,百位。。  
        }  
        System.out.println(ans);      	 
      }
 } 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值