zoukankan      html  css  js  c++  java
  • 软件工程课堂练习——找出1-n中1出现的个数

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

    要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12)  = 5。
       在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
    一、设计思想
      通过归纳法,可以发现:

      假设N = abcde,这里a,b,c,d,e分别是十进制数N的各个数位上的数字。如果要计算百位上出现1的次数,将受3方面因素影响:百位上的数字,百位以下(低位)的数字,百位(更高位)以上的数字。

      如果百位上的数字为0,则可以知道百位上可能出现1的次数由更高位决定,比如12 013,则可以知道百位出现1的情况可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个。也就是由更高位数字(12) 决定,并且等于更高位数字(12)×当前位数(100)。

      如果百位上的数字为1,则可以知道,百位上可能出现1的次数不仅受更高位影响,还受低位影响,也就是由更高位和低位共同决定。例如12 113, 受更高位影响,百位出现1的情况是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个,和上面第一种情况一样,等于更高位数字(12)×当前位数(100)。但它还受低位影响,百位出现1的情况是12 100-12 113,一共114个,等于低位数字(113)+1。

      如果百位上数字大于1(即为2-9),则百位上可能出现1的次数也仅由更高位决定,比如12 213,则百位出现1的情况是:100-199,1 100-1 199,……,11 100-11 199,12 100-12 199,共1300个,并且等于更高位数字+1(12+1)×当前位数(100)。

    二、源代码

     1 package com.java.lianxi;
     2 
     3 import java.util.Scanner;
     4 
     5 public class lianxi9 {
     6     public static void main(String[] args)
     7     {
     8         Scanner cin=new Scanner(System.in);
     9         System.out.print("请输入正整数的最大值:");
    10         int n=cin.nextInt();
    11         System.out.print("1的个数为:"+Sum1s(n));
    12     }
    13     public static int Sum1s( int n )  
    14     {  
    15         int iCount = 0;  
    16         int iFactor = 1;  
    17       
    18         int iLowerNum = 0;  
    19         int iCurrNum = 0;  
    20         int iHigherNum = 0;  
    21       
    22         while( n / iFactor != 0 )  
    23         {  
    24             iLowerNum = n - ( n / iFactor ) * iFactor;  
    25             iCurrNum = (n / iFactor ) % 10;  
    26             iHigherNum = n / ( iFactor *10 );  
    27       
    28             switch( iCurrNum )  
    29             {  
    30             case 0:  
    31                 iCount += iHigherNum * iFactor;  
    32                 break;  
    33             case 1:  
    34                 iCount += iHigherNum * iFactor + iLowerNum + 1;  
    35                 break;  
    36             default:  
    37                 iCount += ( iHigherNum + 1 ) * iFactor;  
    38                 break;  
    39             }  
    40       
    41             iFactor *= 10;  
    42         }  
    43         return iCount;  
    44     }  
    45 }

    三、运行结果截图

    四、心得体会

      这次练习的思想,和数学中的归纳法很像,俗话说就是找规律,通过列出不同情况,发现规律,从而得到了解决办法,这是一种由特殊到一般的思想。

  • 相关阅读:
    如何加速JavaScript 代码
    以Kafka Connect作为实时数据集成平台的基础架构有什么优势?
    Java多线程开发系列之一:走进多线程
    java运行环境和运行机制
    C#先序遍历2叉树(非递归)
    Java 之 List<T> 接口的实现:ArrayList
    string.split() 解读---------->从java 和C#的角度剖析
    究竟什么是语法糖呢
    Eclipse 恢复删除的文件
    Notepad++自动刷新文本
  • 原文地址:https://www.cnblogs.com/maximumminimum/p/4464240.html
Copyright © 2011-2022 走看看