“找一”

给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

思路:我是根据老师课上提出的思路,

在从X0--X9(x是任意小于等于9的数字)之内只有一个1

在任意X00--X99之内也只有一段x1y(x,y均为常数)

以此类推

比如求23以内的1的个数,23包含0--9,10--19,20--23这三段,每一段各位都含有一个一,而10--19十位也是1所以这一段就包含10个1,所以一共13个一。

比如求100以内的1的个数,100包含0--9,10--19,20--29......90--99这十段,每一段各位都含有一个一共是个1,而10--19十位也是1所以这一段就包含10个1,但是要注意的是100也含有一个1,所以一共23个一。

具体代码实现如下:(编译环境:vs2008,语言c++)

#include <iostream>
#include <cmath>
using namespace std;
#define N 5

int findone(int i){
	int a[N];
	int p = 0,j,num = i; ;
	int sum = 0;
	while(i){
		if(p < N){
			a[p] = i%10;
			i = i/10;
		}
		p++;
	}
	if(a[p-1]!=1){
		for(j = 0;j < p;j++){
			if(a[j] >= 1)
				sum += int((num/pow(10,double(j+1))+1))*int(pow(10,double(j))) ;
			else
				sum += int((num/pow(10,double(j+1))))*int(pow(10,double(j))) ;
		}
	}
	if(a[p-1]==1){
		int figure = num;
		for(j = 0;j < p-1;j++){
			if(a[j] >= 1)
				sum += int((num/pow(10,double(j+1))+1))*int(pow(10,double(j))) ;
			else
				sum += int((num/pow(10,double(j+1))))*int(pow(10,double(j))) ;
			figure = int(a[j]*pow(10,double(j)));
		}
		sum = sum+figure+1;
	}
	return sum;
}

void main(){
   int i;
   cout<<"please input a number :"<<endl;
   cin>>i;
   cout<<"the amount of 1 is :     "<<findone(i)<<endl;
   system("pause");

}

  

总结,刚开始的时候老师提出要找规律觉得会很难实现,可是当自己认真做的时候发现其实并不是很难只要发现规律代码就很容易能实现

时间: 2024-11-05 18:38:21

“找一”的相关文章

Class热替换与卸载

概述 名词解释:所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用.本文主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理. Class热替换 ClassLoader中重要方法: loadClass:ClassLoader.loadClass(…) 是ClassLoader的入口点.当一个类没有指明用什么加载器加载的时候,JVM默认采用AppClassLoader加载器加载没有加载过的class,调用的方法的入口就是

PostgreSQL中查找最大连续性字段

一.建表 lihao=#create table tb (id int,pid int,name varchar); lihao=#INSERT INTO tb VALUES (1, 0, '广东省'); lihao=#INSERT INTO tb VALUES (2, 0, '浙江省'); lihao=#INSERT INTO tb VALUES (3, 2, '衢州市'); lihao=#INSERT INTO tb VALUES (4, 2, '杭州市'); lihao=#INSERT I

Java对List对象进行排序

有时候需要对List对象进行排序,如果每一处都去写一个排序方法,就会产生重复代码的坏味道,而且每一处都写,工作量会很大.我们知道,Java提供了一个Collections.sort()方法可以对List排序,利用Java反射机制,很容易就能写出一个通用的排序方法. 为了防止出现不按照getter,setter规范命名的POJO类,我不打算动态调用getXXX()方法,而是直接获取对象的属性值.为了达到不论是否是public成员变量,都能获取到的目的,在获取到Field后,调用了setAccess

心若迅雷会员账号获取器

心若迅雷会员账号获取器是一个绿色免费的迅雷会员获取小工具,每天都会发布多个有效的迅雷会员账号供大家使用,用户可以使用这些账号登陆迅雷进行离线下载. 获取迅雷白金会员一人一号说明以及流程:点击下面的(立即获取白金会员一人一号)进行获取,会自动打开一个软件安装提示,点击(立即点击安装)然后点软件上的注册账号然后通过注册的账号登陆视频聊天软件,然后随便进个房间免费观看2分钟视频,2分钟以后软件自动发送一人一号白金账号到你邮箱!如果按操作后没发送到自己邮箱请联系客服QQ:1625223157领取一人一号

c# 无法加载xxx.dll 找不到指定的模块(如何指定文件夹)

如果直接放在项目运行目录,例如bin/debug可以直接加载,但是这样比较乱. 如果在放debug里面的一个文件夹里面,有可能会报错“无法加载xxx.dll 找不到指定的模块”. 如果路径写成这样就会报错 framework/linphone 解决方法:将/ 改成"\" framework\linphone

游戏开发 系统app开发游戏定制开发找谁

梦幻珍珠港理财拆分游戏系统软件开发怎么做?找[江生:185-2911-8412 微电]. 梦幻珍珠港拆分游戏平台开发.梦幻珍珠港理财全网模式开发.梦幻珍珠港收益模式介绍开发. 梦幻珍珠港拆分游戏系统源码搭建平台!!我们是软件开发,玩家勿扰!非平台客服,玩家勿扰!] 游戏规则: 一.开发新会员要从您的库房扣除3 03颗珍珠,体系扣除5颗珍珠,新会员有298颗珍珠. 二.推荐老友,推荐人能够得到第一代会员的2%,第二代会员的1%,第三代会员的0.5%,一代的收益就是5.96颗珍珠奖赏(可转换为等量可

18-硬币找零

/*                                     硬币找零 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述    在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资.    我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,    0.02,0.01 元,采用这些硬币我们可以对任

PAT乙级-1037. 在霍格沃茨找零钱(20)

如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易."现在,给定哈利应付的价钱P和他实付的钱A,你的任务是写一个程序来计算他应该被找的零钱. 输入格式: 输入在1行中分别给出P和A,格式为"Galleon.Sickle.Knut",其间用1个空格分隔.这里Galleon是[0, 107]区间内的整数,Sickle是[0, 17)区间

十九. 想高速开发app,须要找外包吗?

健生干货分享:第19篇 摘要:近期和两位准备开发app的创业者聊天,他们之前没有移动互联网的相关经验.有的是想法和资金.他们在纠结:想高速开发app,须要找外包吗? 近期和两位想开发app的创业者聊天.他们之前没有移动互联网的相关经验.有的是想法和资金.因为没有移动互联网的相关经验,想高速开发app.但又怕组建技术团队的时间过长.影响产品的开发.询问了我一些找外包的事项,我就在这篇文章里整理一下我的一些看法.下面的这些论述.都是针对整个app外包的情况(包括设计稿,原型图,前后端). 1.找外包

Hyper-V虚拟机Redhat添加网卡找不到网卡配置文件解决方法

环境:Hyper-V虚拟机上面安安装Redhat6.7 问题:系统安装时,只有一块网卡,现根据需要,增加一块网卡,DHCP获取IP地址,在Hyper-V设置中增加网卡后,存在连个问题:1./etc/sysconfig/network-scripts/中找不到配置文件且无法连接外网 解决方法: 1.cat /etc/udev/rules.d/70-persistent-net.rules 查看网卡的MAC地址和网卡名称 2. 在/etc/sysconfig/network-scripts/下建立i