课堂练习——得出“1”的个数

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

要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12)  = 5。在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

一、设计思路

首先,此题可以用从1到N遍历一遍的方法来解决。即输入一个数除以10取余数,如果余数等于1则计数加1,否则计数加0,然后此数除以10,直到此数除以10结果等于0。然而,此种方法多做了很多无用功。我们做练习的目的并不是实现程序,而是学会各种算法来优化程序。所以,此题第二种解法则是统计各种情况下,“1”个数的变化规律。

规律变化:

f(3)=1;

f(13)=2+1;f(23)=3+10;f(33)=4+10;f(43)=5+10;f(53)=6+10;f(63)=7+10;……;f(93)=10+10;

f(103)=11+10+4;f(113)=12+12+14;f(123)=13+20+24;……

……

通过对数字进行有规律的总结,发现从1到N,中出现的所有的1的总数。可以从N这个数总结出来的。

f(N)=个位上出现1的次数+十位上出现1的次数+百位上出现1的次数+……

所以对于一个数abcde,取百位上的c来计算,

假若c是"1",那么百位上1的个数是由他的高位和低位来决定的。等于ab*100+cde+1;

假若c是"0",那么百位上1的个数是ab*100;

假如c是大于1,那么 百位上1的个数是(ab+1)*100;

二、源代码

 1 #include <iostream.h>
 2 int f(int n)
 3 {
 4     int Count=0;
 5     int Factor=1;
 6     int LowerNum=0;
 7     int CurrNum=0;
 8     int HigherNum=0;
 9     while(n/Factor!=0)
10     {
11         LowerNum=n-(n/Factor)*Factor;
12         CurrNum=(n/Factor)%10;
13         HigherNum=n/(Factor*10);
14         switch(CurrNum)
15         {
16             case 0:
17             Count+=HigherNum*Factor;
18             break;
19             case 1:
20             Count+=HigherNum*Factor+LowerNum+1;
21             break;
22             default:
23             Count+=(HigherNum+1)*Factor;
24             break;
25         }
26         Factor*=10;
27     }
28     return Count;
29 }
30 int main()
31 {
32     int num;
33     cout<<"请输入十进制整数:"<<endl;
34     cin>>num;
35     cout<<f(num)<<endl;
36     return 0;
37 }  

三、运行结果

四、个人总结

由于定义的全是int类型,所以输入的数据不宜过大。通过找规律而优化程序,减少了程序的运行次数,能使程序更加迅速地运行。遍历一遍的方法太过简单,使用此方法,对于我们来说,并未获得什么有价值的经验。而使用此种方法,却过于考验我们的脑力,让我对程序的用途产生了思考,程序到底是为了方便还是为了节约运行时间?但是,如果只是为了方便,凡是有点编程基础的都能解决此类问题,我们的存在就失去了意义。我们的工作就是优化用户与计算机之间的交流通道。

时间: 2024-11-03 05:43:04

课堂练习——得出“1”的个数的相关文章

java第二次课堂小作业求 五个数的平均数 最大数以及最小数

import java.util.*; public class dew{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); int a; double avarge=0; int max,min; max=min=sc.nextInt(); avarge=max/5.0; for(int i=1;i<5;i++){ a=sc.nextInt(); if(a>max){ max=a; } if(

找1的个数

课堂练习——得出“1”的个数 2015-05-03 20:30 by 奔波儿灞, 5 阅读, 0 评论, 收藏, 编辑 题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12)  = 5.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 一.设计思路 首先,此题可以用从1到N遍历一遍的方法来解决.即输入一个数除以10取余数,如果余数等于1则计数加1,否则

课堂练习之找“1”的个数

一.题目 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数出其中1的个数. 二.要求 1.写一个函数F(N),返回1~N之间出现“1”的个数,例如:F(12)=5; 2.在32位整数范围内,满足条件的“F(N)=n”的最大的N是多少; 三.思路 情况1:如果百位上的数字为0,则可以知道百位上可能出现1的次数由更高位决定,比如12 013,则可以知 道百位出现1的情况可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个.也就是 由更高位数字

课堂练习-4个数的和

//YuxiZhang 2016.9.20//用于输入四个整数并计算四个整数的和package demo;   import java.util.Scanner;   public class JiSuan {   public static void main(String[] args) {  int count;//count用来表示第几个数  double next,sum;//next存放输入的4个整数,sum用来存放和  sum=0;//对sum初始化   Scanner sc =n

4月28号周二课堂练习:求“1”的个数

一.题目要求 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12)  = 5. 2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.设计思路 (1)一位数时 f(0)=0;f(1)=1;f(2-9)=1; (2)二位数时 f(10)=1+(0+1)=2; f(11)=(1+1)+(1+1)=4; f(12)=(1+1)+(2+1)=5; f(1

课堂练习——找十进制数中数字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

课堂练习_找出1的个数

一.思路想法 在找出1的个数,首先不能用穷举的方法.在此程序中,我借鉴了同学的方法,将各个位 上的数值的1的个数相加,最后得出最终的个数. 二.代码 #include "stdafx.h" #include <stdio.h> int Count(int num) { int count,mul,num1,num2,num3; count=0; mul=1; num1=num2=num3=0; while(num/mul) { num1=num-(num/mul)*mul;

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

一.题目 1 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 2 要求: (1) 写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  = 5. (2)在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.设计思想 (1)一位数时 f(0)=0;f(1)=1;f(2-9)=1; (2)二位数时 f(10)=1+(0+1)=2; f(11)=(1+1)+(1+1)=4; f(12)=(1+1)+(2+1)=5;

软件工程课堂练习——找出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方面因素影响:百位上的数字,百位以下(低位)的数字,百位(更高位)以上的数字.