zoukankan      html  css  js  c++  java
  • 找一

    一、实验题目

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

         要求:

        1、写一个函数F(N),返回1~N之间出现“1”的个数,例如:F(12)=5;

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

    二、设计思路

      考虑到时间复杂度,首先摒弃遍历的方法。

      然后找规律:

      通过分析Num每一位上的1的个数,将32位正整数的遍历简化为做多循环10次(因为32位无符号整数范围:0 - 4294967295,仅有10位),经过分析,我发现存在这样的规律:

          每一位上都只有三种情况:0,1,2-9

    第 i 位(个位算作第0位,十位算作第1位。。。。。):

          0:   Num/(10^(i+1))*(10^i)

          1:     Num/(10^(i+1))*(10^i)+Num%(10^i)+1;

          2-9:  (Num/(10^(i+1))+1)*(10^i)

    可实现最大数:应该是4294967295,但实际不行,9位数是没问题的。

    三、代码

     1 // Finding_the_number_of_1.cpp
     2 // by 梁世豪
     3 // 2015/4/29
     4 
     5 #include "stdafx.h"
     6 #include "iostream"
     7 #include "math.h"
     8 using namespace std;
     9 int main()
    10 {
    11 zailai:
    12     unsigned long int max=0;//要查询的数
    13     unsigned long int num=0;//结果
    14     int n;//位数
    15     int i=0;
    16     int m=1;
    17     int j=0;
    18     int k=0;//判断本位上是0,1还是其他数
    19     unsigned long int array[10]={0,0,0,0,0,0,0,0,0,0};//32位正整数最大10位数
    20     cout<<"请输入要查询的正整数:";
    21     cin>>max;
    22     cout<<"这个数的位数:";
    23     cin>>n;
    24     for(i=0;i<n;i++)
    25     {
    26         m=1;
    27         for(j=1;j<=i;j++)
    28         {
    29             m=m*10;
    30         }
    31         k=(max%(m*10))/m;
    32         cout<<k<<endl;
    33         if(k==0)
    34         {
    35             m=1;
    36             for(j=1;j<=i;j++)
    37             {
    38                 m=m*10;
    39             }
    40             array[i]=max/(m*10)*m;
    41             cout<<"0有"<<array[i]<<endl;
    42         }
    43         else if(k==1)
    44         {
    45             m=1;
    46             for(j=1;j<=i;j++)
    47             {
    48                 m=m*10;
    49             }
    50             array[i]=(max/(m*10))*m+max%m+1;
    51             cout<<"1有"<<array[i]<<""<<endl;
    52         }
    53         else
    54         {
    55             m=1;
    56             for(j=1;j<=i;j++)
    57             {
    58                 m=m*10;
    59             }
    60             array[i]=(max/(10*m)+1)*m;
    61             cout<<"2-9有"<<array[i]<<endl;
    62         }
    63         num=num+array[i];
    64     }
    65 
    66     cout<<"共有"<<num<<"个‘1’"<<endl;
    67     goto zailai;
    68     return 0;
    69 }

    四、运行截图

    五、总结

      喜欢这种游戏类的编程,结合老师的提示,总结了规律之后,终于把程序写出来了。

  • 相关阅读:
    【常用】source insight常用设置及快捷键
    【Linux学习】配置环境:实现【VirtualBox + ubuntu】+【开启ssh服务】+【putty远程连接到虚拟机】
    javascript:区别浏览器
    linux 之centos6.3 安装中文输入法
    前端优化(静态资源)
    javascript 学习心得!
    编程总结
    2019年春季学期第二周作业
    HTTP could not register URL http://+:8000/testservice/. Your process does not have access rights to this namespace 解决方案
    [原]ASP.NET MVC 3 Razor + jqGrid 示例
  • 原文地址:https://www.cnblogs.com/zglsh/p/4470187.html
Copyright © 2011-2022 走看看