zoukankan      html  css  js  c++  java
  • 1的个数

    一.题目及要求

      1.题目

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

      2.要求

        要求:

          1)写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12)  = 5。

          2)在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

    二.设计思路

      此题显然可以使用穷举的方式计算,若是如此,便失去了练习的意义所在。在这里我们可以利用数学的方法找规律。

      在此,假设,用户输入的整数是num,分析如下:

      当num是一位数时:f(num)=1(若num=0,则函数值是0)

      当num是两位数时:可以将其写成f(num)=个位数是1的个数+十位数是1的个数;

                f(12)=2+4=6;

                f(22)=3+10=13;

                f(32)=4+10=14;

                ………………

      当num是三位数时:同理,写成f(num)=个位数是1的个数+十位数是1的个数+百位数是1的个数;

                f(132)=14+20+33=67

                ………………

      当num是四位数五位数时同样如此分析;

      若num=abcde,计算百位上出现1的个数,该值受三部分影响,(1)c上的值(2)de的值(3)ab的值

         1)若c=0,则受ab的值得影响,那么百位1的个数=ab*当前的位数(100);(若num=12045,则该值是12*100=1200)

         2)若c=1,则受ab和de的影响,那么百位1的个数=ab*当前为数(100)+de+1;(若num=12145,则该值=12*100+45+1=1246)

         3)若c∈[2,9],则受ab的影响,那么百位1的个数=(ab+1)*当前位数(100);(若num=12345,则该值=(12+1)*100);

    三.源代码

    // search_1.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include<iostream.h>
    /*函数-寻找1的个数*/
    int search_1(int num)
    {
        int count=0;
        int H_num,C_num,L_num;              //当前位C_num和高位H_num,以及低位L_num)
        int flag=1;
        while(num/flag!=0)
        {
            H_num=num/(flag*10);            //高位
            C_num=(num/flag)%10;            //当前位
            L_num=num%flag;                 //低位
            switch(C_num)
            {
                case 0:                                //当前位是0的时候
                    count=count+H_num*flag;
                    break;
                case 1:
                    count=count+H_num*flag+L_num+1;    //当前位是1的时候
                    break;
                default:
                    count=count+(H_num+1)*flag;        //当前位在2~9之间时
                    break;
            }
            flag=flag*10;
        }
        return count;
    }
    int main()
    {
        int num;                        //用户输入的数据
       
        cout<<"请输入数据:";
        cin>>num;
        
        cout<<"1出现的个数为:"<<search_1(num)<<endl;
        return 0;
    }

    四.结果及截图

      

      

      

    五.心得体会

      1)刚开始看见这个题目的时候,便想到了最简单的方法也是最笨的方法—枚举,但是这样便失去了练习的意义。然后才开始找规律。

      2)这个程序再一次的向人们展示了数学思想在编程中的应用,此程序的核心就是找规律,在找枚举的过程中,看你对数字的敏感程度,总结规律。

  • 相关阅读:
    csrf攻击实例
    《四 数据库连接池源码》手写数据库连接池
    《四 spring源码》手写springmvc
    spring和springmvc是单例还是多例
    redis集群设置密码
    mongodb3.6集群搭建:分片集群认证
    mongodb3.6集群搭建:分片+副本集
    Mongo 3.6.1版本Sharding集群配置
    windows计划任务
    Redis slowlog慢查询
  • 原文地址:https://www.cnblogs.com/menglikanhualuo/p/4472209.html
Copyright © 2011-2022 走看看