zoukankan      html  css  js  c++  java
  • 积累1数

    http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=2154

    如以下的问题:特定1十进制整数N,从计算1至N所有整数“数字1”出现次数

    例如:N=12,序列={1,2,3,4,5,6,7,8,9,10,11,12},当中出现“1”的个数是5。故f(12)=5

    解法:对于此题,《编程之美》中给出了一个巧妙的解法。

    主要思路是:将总结果拆分成几个结果的和,如对于一个5位的整数abcde,序列中百位上出现1的次数受百位上的数字c影响。千位上出现1的次数受b影响,依此类推;最后将各个数位上1出现的次数加起来即为总和。

    归纳总结。分成下面三种情况:以百位上的数字c为例:

    1.假设c=0。则1在百位出现的次数受高位上的数字影响,为高位数字ab*100(100为当前乘数因子,在个位时为1,十位为10,百位为100等等)

    2.假设c=1;则1在百位出现的次数既受高位影响,也受低位影响,高位影响的个数为高位数字ab*100(当前因子)。低位影响的个数为低位数字de+1

    3.假设c>1。则1在百位出现的次数仅受高位上的数字影响。为(ab+1)*100(当前因子)


    cpp代码:

    #include <iostream>
    using namespace std;
    int CountOne(int num){
        int mod,cnt=0,factor=1;
        int tmp=num;
        while(num!=0){
            mod=num%10;
            switch(mod){
            case 0:
                cnt+=(tmp/(factor*10))*factor;
                break;
            case 1:
                cnt+=(tmp/(factor*10))*factor+(tmp%factor)+1;
                break;
            default:
                cnt+=(tmp/(factor*10)+1)*factor;
                break;
            }
            num/=10;
            factor*=10;
        }
        return cnt;
    }
    
    int main(){
        int n;
        while(cin>>n){
            cout<<CountOne(n)<<endl;
        }
        return 0;
    
    }
    




  • 相关阅读:
    centos7-根据端口号查看所属应用
    centos7-网络与防火墙常用命令
    docker(5)常用命令
    docker(4)使用Dockerfile文件创建镜像-对docker(3)的改进
    [多校联考2021] 模拟赛4
    [省选前集训2021] 模拟赛7
    [多校联考2021] 模拟赛3
    [学习笔记] 圆方树
    [多校联考2021] 模拟赛2
    [学习笔记] 反悔贪心
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5038676.html
Copyright © 2011-2022 走看看