zoukankan      html  css  js  c++  java
  • 课堂练习——找十进制数中数字1的个数

    题目要求:

    给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
    要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12)  = 5。
        2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
    一、解决思路
      通过列举几个数进行计算,可以发现函数f(N)规律如下:
      1.一位十进制数:当N>=1时,f(N)=1;当N=0时,f(N)= 0;
      2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4=6;
              f(23)=个位出现1的个数+十位出现1的个数=3+10=13;
              ......
              f(93)=个位出现1的个数+十位出现1的个数=10+10=20;
      3.三位十进制数:f(123)=个位出现1的个数+十位出现1的个数+百位出现1的个数=13+20+24=57;     
      4.f(abcde),计算c位上的1的个数,需要看ab、c、de的情况:
        当c=0时,受高位影响,百位上出现1的个数为:(ab)*100
        当c=1时,受高位和低位影响,百位上出现1的个数为:(ab)*100+((cde)+1)
        当c>1时,受高位影响,百位上出现1的个数为:((ab)+1)*100
    二、程序代码
    #include "stdafx.h"
    #include<iostream.h>
    #include "stdlib.h"
    int CountNum(int n)
    {
        int count=0; 
        int factor=1; 
        int LowerNum=0;
        int CurNum=0;
        int HigherNum=0;
        while (n/factor!=0)       
        {
            LowerNum=n-(n/factor)*factor;
            CurNum=(n/factor)%10;
            HigherNum=n/(factor*10);
            switch (CurNum)
            {
            case 0:
                count=count+HigherNum*factor;
                break;
            case 1:
                count=count+HigherNum*factor + LowerNum +1;
                break;
            default:
                count=count+(HigherNum+1)*factor;
                break;
            }
            factor=factor*10;
        }
        return count;
    }
    
    int main()
    {
        int num;
        cout<<"请输入数字:
    ";
        cin>>num;
        cout<<"
    ";
        cout<<num<<"中出现数字1的个数为:
    ";
        cout<<CountNum(num)<<endl;
        return 0;
    }

    三、结果截图

     
    四、心得体会
         在课上一开始拿到这个题目,第一反应想的就是找规律,通过举一些例子,特殊数字来观察,但是一开始的时候由于数太多,自己计算的时候出现了错误,很混乱,后来经过老师讲解和同学讨论,找到规律的方向,心平气和的再去计算,这才找出它的规律,像这种找规律的算法,必定要心平气和,不能暴躁,更不能放弃。
  • 相关阅读:
    【bzoj1174】[Balkan2007]Toponyms Trie树
    【bzoj1786】[Ahoi2008]Pair 配对 dp
    【bzoj3956】Count 单调栈+可持久化线段树
    【bzoj4605】崂山白花蛇草水 权值线段树套KD-tree
    【bzoj3696】化合物 树形dp
    【bzoj1150】[CTSC2007]数据备份Backup 模拟费用流+链表+堆
    【bzoj3671】[Noi2014]随机数生成器 贪心
    【bzoj4653】[Noi2016]区间 双指针法+线段树
    【bzoj4197】[Noi2015]寿司晚宴 分解质因数+状态压缩dp
    用Python操作Named pipe命名管道,实用做法——os.read 或 os.write
  • 原文地址:https://www.cnblogs.com/luyu2783/p/4467035.html
Copyright © 2011-2022 走看看