zoukankan      html  css  js  c++  java
  • 1009 数字1的数量 分类: 51nod 2015-07-20 21:44 3人阅读 评论(0) 收藏

    给定一个十进制正整数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的个数
    Input示例
    12
    Output示例
    5
    这个用普通的暴力是肯定会超时,所以要找规律,规律在这个博客上http://www.cnblogs.com/jy02414216/archive/2011/03/09/1977724.html
    那里介绍了三种方法,而我用的是第二种方法
    代码如下
    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<math.h> 
    using namespace std;
    __int64 get_ans(int n)
    {
       __int64 count=0; 
         if(n==0) 
         {
          count=0;
         }
         else if(n>1&&n<10)
         {
          count=1;
         }
         else
         {
          int high=n;
          int bit=0;
          while(high>=10)
          {
           high=high/10;
           bit++;
          }
          int weight=pow(10,bit);
          if(high==1)
          {
           count+=get_ans(weight-1)+get_ans(n-weight)+n-weight+1; 
          }
          else
          {
           count+=high*(get_ans(weight-1))+get_ans(n-high*weight)+weight; 
          }
         }
         return count;
    }
    int main()
    {
     int n;
     scanf("%d",&n);
     printf("%lld",get_ans(n));
     return 0;
    }
         
         
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Spark集群搭建步骤
    Hadoop集群搭建步骤
    Linux上传与下载(sz-rz)
    Spark文档
    Hadoop基本命令详解
    lzo压缩格式文件查看
    hadoop端口配置指南
    eclipse无法连接到makertplace
    Socket 服务端使用多线程实现多客户端通讯实例
    Jenkins和Sonar集成
  • 原文地址:https://www.cnblogs.com/NaCl/p/4700593.html
Copyright © 2011-2022 走看看