码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-02 20:39:29      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

一、题目要求

给定一个十进制的正整数,写下从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(13)=(1+1)+(3+1)=6;
    f(23)=(2+1)+10=13;
    f(33)=(3+1)+10=14;
    f(93)=(9+1)+10=20;
  (3)三位数时
    f(123)=个位出现的1数+十位出现的1数+百位出现的1数
  (4)N = abcde时
    以c位为例
    if(c==0)  num=ab*100;
    if(c==1)  num=ab*100+de+1;
    if(c>=2)  num=(ab+1)*100
三、源程序
#include<iostream>
#include<math.h>
using namespace std;

int Count1Num(int Digit)
{
	int figure=1;//标记计数1的位数(1为个位,10为十位)
	int curOfDigit=0;//当前位数数字
	int lowerOfDigit=0;//较低位数字大小(可为多位)
	int higherOfDigit=0;//较高位数字大小
	int count=0;
	while(Digit/figure!=0)
	{
		//获取数字
		curOfDigit=(Digit/figure)%10;
		lowerOfDigit=Digit-(Digit/figure*figure);
		higherOfDigit=Digit/(figure*10);
		if(Digit<=0)
			return 0;
		if(0==curOfDigit)//当前数字为0时计数
		{
			count+=higherOfDigit*figure;
		}
		else if(1==curOfDigit)//当前数字为1时计数
		{
			count+=higherOfDigit*figure+lowerOfDigit+1;
		}
		else
		{
			count+=(higherOfDigit+1)*figure;
		}
		figure=figure*10;//数字左移一位
	}
	return count;
}
void main()
{
	int Digit;
	int max=0;
	while((cout<<"请输入要测试的数值(输入-1结束测试):"<<endl)&&(cin>>Digit))
	{
		if(Digit==-1)
			break;
		cout<<"1到"<<Digit<<"包含的1个数:"<<Count1Num(Digit)<<endl;
	}
}

四、运行截图

技术分享

五、实验总结

题目的难点主要是在于寻找“1”出现的规律,然后根据找到的贵写出相应的算法。题目不算难,但是规律还是很难找的。

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

标签:

原文地址:http://www.cnblogs.com/huangxiaofei/p/4472365.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!